我有2个表vendors
和partners
vendors
表仅存储某些公司的某些公司和partners
餐桌存储用户的名称,这些用户在某些公司工作。因此结构是这样的:
供应商
| id | name |
+------+---------------+
| 1 | Vendor-1 |
| 2 | Vendor-2 |
| 3 | Vendor-3 |
合作伙伴
| id | user_name | password |vendor_id | is_owner | is_admin | is_technitian |
+----+------------+-----------+----------+------------+------------+---------------+
| 1 | abc | ^&ASKJHA | 1 | 1 | 1 | 0 |
| 2 | def | ^&ASKJHA | 2 | 1 | 1 | 0 |
| 3 | ghi | ^&ASKJHA | 1 | 0 | 1 | 0 |
| 4 | jkl | ^&ASKJHA | 3 | 1 | 1 | 0 |
| 5 | mno | ^&ASKJHA | 1 | 0 | 0 | 1 |
| 6 | pqr | ^&ASKJHA | 2 | 0 | 1 | 0 |
| 7 | stu | ^&ASKJHA | 1 | 0 | 0 | 1 |
| 8 | vwx | ^&ASKJHA | 2 | 0 | 0 | 1 |
| 9 | yz | ^&ASKJHA | 3 | 0 | 0 | 1 |
您可以在上面看到的那样,一个合作伙伴是任何供应商的所有者,其余的人是供应商的员工。
我正在与雄辩的Orm合作,并且已经为合作伙伴和供应商定义了模型。我想在供应商模型中添加owner
方法,以便可以直接访问所有供应商对象的所有者。我想知道的是如何在模型定义中关联此问题。它是可行的还是我需要对数据库结构进行一些更改?
class Vendor extends Model{
/**
* Get all the users for this vendor
*/
public function users(){
$this->hasMany(Partner::class);
}
public function owner(){
// how do i relate one owner from partner model who has is_owner == 1
}
}
尝试使用where()
public function owner(){
$this->hasOne(Partner::class)->where('is_owner', true);
}
您可能必须在关系中指定外键。
,而不是定义新的关系,并导致重复的代码并打破干燥原则,使用 local scopes ,该范围 在Eloquent Orm中开箱即。
本地范围允许您定义常见的约束集,您可以在整个应用程序中很容易重复使用这些约束。例如,您可能需要经常检索所有被认为是"流行的用户"。要定义范围,只需将雄伟的模型方法带有范围。
范围应始终返回查询构建器实例:
例如: - 在供应商模型中定义函数scopeowner(),例如:
public function scopeOwner($query)
{
return $query->where('is_owner', 1);
}
,然后在控制器中使用它或按以下方式实现:
$vendor->users()->owner()->get();
定义了范围后,您可以在查询模型时调用范围方法。但是,调用该方法时,您无需包括示波器前缀。您甚至可以链接到各种范围。
接下来是什么,您甚至可以使用动态范围来重新使用更好的代码。
有时您可能希望定义接受参数的范围。首先,只需将其他参数添加到范围。范围参数应在$查询参数之后定义:
public function scopeOfType($query, $type)
{
return $query->where('is_owner', $type);
}
并将其消耗如下:
$vendor->users()->ofType(0)->get();
有关更多信息,请返回官方文档:雄辩的ORM范围