0

我有 2 张桌子vendorspartners

vendorstable 只存储了一些公司的名字,partnerstable 存储了为一些公司工作的用户。所以结构是这样的:

供应商

|  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
  }
}
4

2 回答 2

1

尝试where()

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

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

于 2017-03-04T10:35:10.607 回答
1

不要定义新的关系,导致重复代码和破坏 DRY 原则,而是使用Eloquent ORM 中开箱即用的Local Scopes 。

本地范围允许您定义可以在整个应用程序中轻松重用的通用约束集。例如,您可能需要经常检索所有被认为“受欢迎”的用户。要定义范围,只需在 Eloquent 模型方法前面加上范围即可。

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

例如:- 在您的 Vendor 模型中定义一个函数 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

于 2017-03-04T11:06:13.247 回答