雄辩模型:使用子表

时间:2017-03-04 10:31:00

标签: mysql laravel laravel-5 eloquent laravel-eloquent

我有2个表vendorspartners

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        |

正如您在上面所看到的那样,一个合作伙伴是任何供应商的所有者,其余的合作伙伴都是供应商的雇员。

我正在与Eloquent 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
  }
}

2 个答案:

答案 0 :(得分:1)

尝试使用where()

public function owner(){
    $this->hasOne(Partner::class)->where('is_owner', true);
}

您可能必须在关系中指定外键。

答案 1 :(得分:1)

不是定义新的关系,导致重复的代码并打破DRY原则,而是使用Eloquent ORM中开箱即用的本地范围

  

本地范围允许您定义可在整个应用程序中轻松重复使用的常见约束集。例如,您可能需要经常检索所有被认为是#34;流行的用户"。要定义范围,只需在Eloquent模型方法前加上范围前缀。

     

范围应始终返回查询构建器实例:

例如: - 在供应商模型中定义一个函数ScopeOwner(),例如:

public function scopeOwner($query)
{
    return $query->where('is_owner', 1);
}

然后在您的控制器中使用它或按如下方式实现它:

$vendor->users()->owner()->get();
  

定义范围后,可以在查询模型时调用范围方法。但是,调用方法时不需要包含范围前缀。您甚至可以将呼叫链接到各种范围。

接下来,你甚至可以使用动态范围来获得更好的代码重用率。

  

有时您可能希望定义接受参数的范围。要开始使用,只需将其他参数添加到示波器即可。范围参数应在$ query参数后定义:

public function scopeOfType($query, $type)
{
    return $query->where('is_owner', $type);
}

并按如下方式使用它:

$vendor->users()->ofType(0)->get();

有关详细信息,请查看官方文档:Eloquent ORM Scopes