首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雄辩模型:使用子表上的标志定义一对一关系

雄辩模型:使用子表上的标志定义一对一关系
EN

Stack Overflow用户
提问于 2017-03-04 10:30:59
回答 2查看 109关注 0票数 0

我有两个桌子vendorspartners

vendors表只存储某些公司的名称,partners表存储为某个公司工作的用户。所以这个结构是这样的:

供应商

代码语言:javascript
复制
|  id  |   name        |
+------+---------------+
|   1  |   Vendor-1    |
|   2  |   Vendor-2    |
|   3  |   Vendor-3    |

Partners

代码语言:javascript
复制
| 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方法,这样我就可以直接访问任何供应商对象的所有者。我想知道的是,我如何在我的模型定义中把这个联系起来。它是可行的还是我需要对我的数据库结构做一些修改?

代码语言:javascript
复制
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
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-04 10:35:10

尝试使用where()

代码语言:javascript
复制
public function owner(){
    $this->hasOne(Partner::class)->where('is_owner', true);
}

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

票数 1
EN

Stack Overflow用户

发布于 2017-03-04 11:06:13

而不是定义一个新的关系,导致重复的代码和打破干燥的原则,使用本地Scopes,这是从盒子里出来的雄辩的ORM。

本地作用域允许您定义公共约束集,您可以轻松地在整个应用程序中重用这些约束集。例如,您可能需要经常检索所有被认为“受欢迎”的用户。要定义作用域,只需在雄辩的模型方法前面加上作用域。 作用域应始终返回查询生成器实例:

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

代码语言:javascript
复制
public function scopeOwner($query)
{
    return $query->where('is_owner', 1);
}

然后在控制器中使用它,或者按以下方式实现它:

代码语言:javascript
复制
$vendor->users()->owner()->get();

一旦定义了范围,您就可以在查询模型时调用scope方法。但是,在调用方法时不需要包含范围前缀。您甚至可以将调用链接到不同的作用域。

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

有时,您可能希望定义接受参数的范围。要开始,只需将附加参数添加到范围内即可。作用域参数应该在$query参数之后定义:

代码语言:javascript
复制
public function scopeOfType($query, $type)
{
    return $query->where('is_owner', $type);
}

并按以下方式消费:

代码语言:javascript
复制
$vendor->users()->ofType(0)->get();

有关更多信息,请返回到正式文档:雄辩的ORM司仪

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42594921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档