【问题标题】:How Do Inverse Relationships Work in Laravel Eloquent?反向关系如何在 Laravel Eloquent 中工作?
【发布时间】:2018-11-28 09:06:23
【问题描述】:

我有两个模型/表:publishercampaign.

出版商

id | name

广告系列

id | name | PubID

我创建了一个关系来获取发布商的广告系列。

$this->hasMany(Campaign::class, 'PubID'); /* In Publisher Model */

我相信上述行将帮助我检索相关的广告系列,但我对反向关系感到困惑。

如您所见,publisher 表中没有键 campaign_id。下面的关系是否足以逆向?

return $this->belongsTo('App\Publisher'); /* In Campaign Model */

有人可以指导我吗?我会很感激的。

【问题讨论】:

  • 您还需要在belongsTo 部分中指定外键名称,方法与在hasMany 部分中的方式相同。
  • @apokryfos 正如我所说,campaign 表内没有 publisher 表的外键
  • 不需要一个。事实上,如果关系是一对一的(这里不是这种情况),你只能在两个表上都有一个外键。 Campaign 中的PubID 足以定义关系的两端

标签: php laravel eloquent relationship


【解决方案1】:

是的,这就是所谓的one to many relationship,这意味着一个发布商有多个广告系列。反之亦然,广告系列属于发布商。 因此,为了获得您使用的发布商的所有广告系列:

Publisher::find($id)->campaigns;

为了获取广告系列的发布者,您使用:

Campaign::find($id)->publisher;

您不需要在发布商表中使用campaign_id,您的广告系列表中的PubID 知道这一点。

【讨论】:

  • 好的,很好的解释。但是竞选模式呢?我在竞选模式中是对的吗?只是想确认一下。谢谢
  • @ScriptLover 是的,没错。但请记住,每当您使用自定义名称作为键名(例如 PubID)时,您都需要为关系提供名称,就像其他人建议的那样,您对 hasMany 所做的那样。更好的命名约定是使用publisher_id,在这种情况下您不需要手动添加外键列名。
  • Op 并没有明确说明一个发布者可以有多个广告系列,但不能有一个广告系列要由多个发布者进行。因此请记住,许多出版商都可以开展活动,Ismoil 在stackoverflow.com/a/53517565/998537 的回答很重要。
【解决方案2】:

您有两个模型并添加了两个外国 id。这是一个多对多的工作。您只需要添加带有 campain_id 和 publiser_id 的数据透视表

这是多对多关系的完美示例:一个发布者可以属于多个广告系列,一个广告系列可以有多个发布者。

出版商

ID |姓名

广告系列

ID |姓名

campaign_publisher

campain_id |发布者_id

列表中的最后一个表 –campaign_publisher 称为“数据透视”表,如主题标题中所述。

所以,选项 1:

class Campaign extends Model
{
    /**
     * The products that belong to the shop.
     */
    public function publishers()
    {
        return $this->belongsToMany('App\Publisher');
    }
}

所以,选项 2:

class Publisher extends Model
{
    /**
     * The shops that belong to the product.
     */
    public function campaigns()
    {
        return $this->belongsToMany('App\Campaign');
    }
}

【讨论】:

    【解决方案3】:

    您需要在 belongsTo 中指定外键名称

    return $this->belongsTo('App\Publisher','PubID');
    

    Laravel Relationships

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2021-02-06
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多