【问题标题】:Model relationship in LaravelLaravel 中的模型关系
【发布时间】:2016-08-08 12:08:31
【问题描述】:

我有 2 个控制器和模型:

  1. 用户控制器:(模型关系:$this->hasMany(Hero::Class);

  2. 英雄控制器:每个英雄都有自己的属性,例如名字、力量和生命。 模型关系:($this->belongsTo(User::class);)

每个用户可以拥有多个英雄。

这意味着USER ID: 1可能有3个英雄:HERO ID 5, 20, 26.

我的问题:如何定义这样的关系并让 laravel 知道如何处理我的 user_heroes 表? 我所说的关系如下图所示:

如何在我的 laravel API 中设置这种关系?

【问题讨论】:

  • 是的,我是这个意思。
  • 在我看来,您想要的是一对多关系,但您的数据库并未反映这种关系。在多对多关系的情况下,您需要一个数据透视表。如果你想建立一对多的关系,你需要在你的hero 表中有一个user_id 字段,你不需要一个数据透视表。这就是 laravel 期望你为这种关系设置数据库的方式。
  • 嗯.. 想想看,一个用户可以拥有多个英雄,但我仍然必须使用“多对多”关系逻辑。我添加了一张图片来更能描述我想要达到的目标。你能确认尽管一个用户可以有多个英雄(这意味着一对多)我仍然必须在 laravel 中使用多对多关系吗?
  • 多个用户可以拥有同一个英雄吗?例如,用户 id 2 也可以拥有 hero id 5 吗?
  • 是的,他也可以拥有英雄 5。@Don'tPanic

标签: laravel


【解决方案1】:

如果一个用户可以有多个英雄,一个英雄也可以属于多个用户,这是多对多的关系。在 Laravel 中,多对多关系的逆关系也是多对多关系,它们都由belongsToMany() 描述。

https://laravel.com/docs/5.2/eloquent-relationships#many-to-many

所以在你的用户模型中:

public function heros() {
    return $this->belongsToMany(Hero::class);
}

在你的英雄模型中:

public function users() {
    return $this->belongsToMany(User::class);
}

Laravel 将假定连接表名为 hero_user,这 2 个模型名称,单数,按字母顺序连接。如果您想像在图像中一样使用user_heroes,则需要指定它:

return $this->belongsToMany(Hero::class, 'user_heroes');

(在两种模型方法中)。

【讨论】:

  • 感谢您的回答。好像我不得不使用多对多的关系。你知道在这种情况下创建一个新的用户英雄(假设用户已经登录)的表达式是什么吗?
  • 类似$user->heros()->attach($hero_id),如果英雄已经存在的话。 laravel.com/docs/5.2/…
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2016-06-12
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多