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();
有关更多信息,请查看官方文档: