Laravel Eloquent 和 3 table 关系

Laravel Eloquent and 3 table relationship

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

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

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

我在 user_items table 上设置了唯一索引,将 1 个用户 ID 限制为 1 个项目 ID,但有一个 qty 列。我想设置 Eloquent 以便我有两个模型,用户和项目。我可以说的地方:

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

问题是我想弄清楚我是否需​​要第三个模型,是否需要 UserItem。

你在这里做的其实是一个M:M关系,而且LaravelEloquent已经支持那个out of the box. user_itemtable 你有被称为枢轴 table.

以下是使用 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');
  }
}

为此,您需要三个迁移:

  • 一个给用户 table
  • 一个用于项目 table
  • 一个用于 item_user table。在 Eloquent 中,主元 table 由两个 table 的名字按字母顺序组成。用破折号分隔。
  • 遵循Eloquent约定,如果您将 FK 设置为使用 _id,Eloquent 将不需要额外信息。因此,在您的情况下,item_user table 中的 FK 应分别为 user_id 和 item_id。
  • 不需要 ItemUser 模型。您可以通过以下方式访问关系中的枢轴:
$user = User::find(1);
$user->items[0]->pivot->qty; // retrieve the quantity