mysql - Laravel Eloquent 和 3 表关系

标签 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。

最佳答案

你在这里做的实际上是一个 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

关于mysql - Laravel Eloquent 和 3 表关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39631620/

相关文章:

MySQL 说 'SYSDATETIME' 不存在

linux - 找不到 Arch Linux Laravel

php - Laravel:当 print_r 查询输出时允许的内存大小耗尽

mysql - 将连接查询转换为嵌套查询

MySQL - 以分钟为单位的年龄

mysql - Order by 子句不适用于此查询

php - 使用 Laravel 和 Carbon 将用户提供的 1970 年之前的日期插入到 MySql

Centos 上的 Laravel Dusk : Failed connect to localhost:9515; Connection refused

mysql - 将多个查找表与系统表映射的策略?

mongodb - Meteor:将文档嵌入到文档中还是将它们分离到每个集合对象中并链接它们?