Mysql 雄辩模型:使用子表上的标志定义一对一关系
我有两个表Mysql 雄辩模型:使用子表上的标志定义一对一关系,mysql,laravel,laravel-5,eloquent,laravel-eloquent,Mysql,Laravel,Laravel 5,Eloquent,Laravel Eloquent,我有两个表供应商和合作伙伴 vendorstable仅存储某些公司的名称和为某些公司工作的partnerstable存储用户。结构是这样的: 供应商 | id | name | +------+---------------+ | 1 | Vendor-1 | | 2 | Vendor-2 | | 3 | Vendor-3 | | id | user_name | password |vendor_id | is_ow
供应商
和合作伙伴
vendors
table仅存储某些公司的名称和为某些公司工作的partners
table存储用户。结构是这样的:
供应商
| 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 |
合作伙伴
| 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()
您可能必须在关系中指定外键。尝试使用where()
您可能必须在关系中指定外键。不要定义新的关系,并导致代码重复和破坏DRY原则,而是使用在雄辩的ORM中现成的局部作用域 局部作用域允许您定义公共约束集,这些约束集可以在整个应用程序中轻松重复使用。例如,您可能需要经常检索所有被认为“受欢迎”的用户。要定义范围,只需在雄辩的模型方法前面加上范围 作用域应始终返回查询生成器实例: 例如:-在供应商模型中定义函数ScopeOwner(),例如:
public function scopeOwner($query)
{
return $query->where('is_owner', 1);
}
然后在控制器中使用或按如下方式实现:
$vendor->users()->owner()->get();
$vendor->users()->ofType(0)->get();
定义范围后,可以在查询模型时调用范围方法。但是,在调用方法时不需要包含作用域前缀。您甚至可以将调用链接到不同的作用域
接下来,您甚至可以使用动态作用域来获得更好的代码重用
有时,您可能希望定义一个接受参数的范围。要开始,只需将其他参数添加到范围中。范围参数应在$query参数之后定义:
并按如下方式消费:
$vendor->users()->owner()->get();
$vendor->users()->ofType(0)->get();
有关更多信息,请查看官方文档:不要定义新的关系,并导致代码重复和打破枯燥的原则,而是使用在雄辩的ORM中现成的局部范围 局部作用域允许您定义公共约束集,这些约束集可以在整个应用程序中轻松重复使用。例如,您可能需要经常检索所有被认为“受欢迎”的用户。要定义范围,只需在雄辩的模型方法前面加上范围 作用域应始终返回查询生成器实例: 例如:-在供应商模型中定义函数ScopeOwner(),例如:
public function scopeOwner($query)
{
return $query->where('is_owner', 1);
}
然后在控制器中使用或按如下方式实现:
$vendor->users()->owner()->get();
$vendor->users()->ofType(0)->get();
定义范围后,可以在查询模型时调用范围方法。但是,在调用方法时不需要包含作用域前缀。您甚至可以将调用链接到不同的作用域
接下来,您甚至可以使用动态作用域来获得更好的代码重用
有时,您可能希望定义一个接受参数的范围。要开始,只需将其他参数添加到范围中。范围参数应在$query参数之后定义:
并按如下方式消费:
$vendor->users()->owner()->get();
$vendor->users()->ofType(0)->get();
有关更多信息,请查看官方文档: