Laravel Eloquent和3桌关系

时间:2016-09-22 06:19:49

标签: mysql laravel database-design laravel-5 laravel-5.3

我正在寻找一些帮助来解决如何为我的应用程序设置Eloquent关系。

我已经为三个表创建了迁移。

| users     |   | items     |   | user_items |
+-----------+   +-----------+   +------------+
| id        |   | id        |   | id         |
| username  |   | name      |   | user_id    |
                                | item_id    | 
                                | qty        | 

我在user_items表上设置了一个唯一索引,将1个用户ID限制为1个项ID,但是使用了qty列。我想设置Eloquent,以便我有两个模型,User和Item。我可以说:

$item = $user->items()->first();
$name = $item->name;
$qty  = $item->qty;

问题是我正在试图弄清楚我是否需​​要第三个模型,UserItem。

1 个答案:

答案 0 :(得分:1)

你在这里做的实际上是M:M关系,而且Laravel Eloquent已经支持o ut of the box.你拥有的user_item表被称为数据透视表。

以下是使用Eloquent建立关系的方法。

// User class
class User extends Eloquent {

 public items() {
   return $this->belongsToMany(Item::class)->withPivot('qty');
 }

}

class Item extends Eloquent {
  public function users() {
       return $this->belongsToMany(User::class)->withPivot('qty');
  }
}

为此,您需要进行三次迁移:

  • 一个用户表
  • 一个用于项目表
  • 一个用于item_user表。在Eloquent中,数据透视表由字母顺序的两个表名组成。用短划线分开。
  • 遵循Eloquent约定,如果您将FK设置为​​使用_id,则Eloquent将不需要其他信息。因此,在您的情况下,item_user表中的FK应分别为user_id和item_id。
  • 不需要ItemUser模型。您可以通过执行以下操作访问关系中的数据透视:
$user = User::find(1);
$user->items[0]->pivot->qty; // retrieve the quantity