【问题标题】:Laravel Mysql: Pivot table or separate model?Laravel Mysql:数据透视表还是单独的模型?
【发布时间】:2016-12-06 11:56:55
【问题描述】:

我有这个 mysql 数据库,其中有两个表:orders & products

表格

+-------------+
|orders       |
+-------------+
|id           |
|address      |
+-------------+

+-------------+
|products     |
+-------------+
|id           |
|price        |
|qty          |
+-------------+

每个Order 有多个items,它们是Product。我知道存储此 order_item 数据的两个选项。

1。订单项模型

使用这种方法,我将创建一个名为OrderItem 的新的雄辩模型和一个名为order_items 的表。并在OrderOrderItem 模型中创建关系。

+-------------+
|order_items  |
+-------------+
|product_id   |
|order_id     |
|price        |
|qty          |
+-------------+


// inside Order model
public function orderItems() {
    return $this->hasMany('App\OrderItem');
}

// inside OrderItem model
public function order() {
    return $this->belongsTo('App\Order');
}

2。数据透视表

创建Order - Product 多对多关系。

+-------------+
|order_product|
+-------------+
|product_id   |
|order_id     |
|price        |
|qty          |
+-------------+

// inside Order model
public function products() {
    return $this->belongsToMany('App\Product')->withPivot('price', 'qty');
}

// inside Product model
public function orders() {
    return $this->belongsToMany('App\Order')->withPivot('price', 'qty');
}

就 Laravel 及其代码而言,哪种方法更好?我相信这个问题不属于 DBA 论坛,因为它几乎是一个 Laravel 问题。征求 Laravel 专家的意见。感谢您的帮助。

【问题讨论】:

  • 所以唯一的区别是表的名称。 !?!?

标签: mysql laravel


【解决方案1】:

我创建了一个单独的OrderItem 模型,并在购买时存储了商品的名称和价格。

数据透视表方法的缺点是,如果相关产品被更新甚至删除,您最终会遇到数据完整性问题。

【讨论】:

  • 您会在order_items 表中添加product_id 列吗?
  • @bazi 是的,但如果products 表中的相应记录被硬删除,我会将其设为空。
【解决方案2】:

数据透视表(或多对多)的主要目的是解决此类问题。

使用数据透视表,您甚至不需要为此创建单独的模型。

我建议您使用数据透视表。这是 Laravel 中的“正确方法”。

【讨论】:

  • 这种关系的一个示例是具有许多角色的用户,其中角色也由其他用户共享。例如,许多用户可能具有“管理员”角色。要定义这种关系,需要三个数据库表:users、roles 和 role_user。多对多关系需要存在中间表。 Eloquent 提供了一些非常有用的方法来与这个表进行交互。 [Laravel](www.laravel.com)
  • 我了解人际关系的运作方式。我写了一本关于 Laravel 的书:packtpub.com/web-development/laravel-5-essentials。我还曾在许多电子商务网站上工作过,并且从经验中知道您不应该将订单与产品直接关联起来。产品变化、缺货等。如果记录被更新或删除,您的订单行项目会受到影响,它不应该受到影响;它应该在客户下订单时及时锁定。
  • 嗯,好点。但这是基于项目/功能的事情来锁定或不锁定它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 2013-12-15
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多