【问题标题】:How to specify pivot table for hasOne() relationship in Laravel如何在 Laravel 中为 hasOne() 关系指定数据透视表
【发布时间】:2014-08-05 18:00:13
【问题描述】:

我有几个模型,其中包含数据透视表以避免多态关系。

role table
id
name
description

restriction table
id
rule
status

restriction_role table
id
restriction_id
role_id

此设置的原因是角色和限制实际上都可以属于多个其他模型。在这种情况下,一个角色只能有 1 个限制。我通常会将其定义为

class Role extends Eloquent {
    public function restrictions()
    {
        return $this->hasOne('Restriction');
    }
}

这显然不起作用,因为 Laravel 不知道连接此关系的数据透视表。我可以通过使用多对多关系轻松实现这一点,但这并不是我的模型的工作方式。在文档中没有看到任何定义这个的东西。有什么想法吗?

【问题讨论】:

  • 为什么不能直接将restriction_id添加到表role
  • 另外,按照惯例,你的方法应该被称为restriction()(单数),因为它只返回一个限制
  • 也许使用 hasManyThrough() 或 belongsToMany() 关系a,即使它只针对一个条目
  • 我想我可以给角色添加restriction_id,但是角色不需要有限制
  • @MarkBaker 我可以使用 belongsToMany。这会很好。但是,由于只有 1 个限制,我尝试使用 hasOne()

标签: php mysql laravel-4 eloquent


【解决方案1】:

我通过使用belongsToMany 关系并为其定义自定义访问器解决了这个问题,如下所示:

public function foo()
{
    return $this->belongsToMany(App\Bar::class);
}

public function getFooAttribute()
{
    return $this->foo()->first();
}

【讨论】:

    【解决方案2】:

    正如@deczo 在 cmets 中所说,belongsToMany() 是关于这里的所有功能。如果您只需要一个结果但不能使用hasOne() 关系,我建议使用first() 方法返回第一个结果。

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 1970-01-01
      • 2014-09-29
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多