【问题标题】:Laravel (and not only) Many-to-many relationship Belongs-To-AllLaravel(不仅如此)多对多关系 Belongs-To-All
【发布时间】:2018-12-13 23:27:49
【问题描述】:

我有两张桌子。 “产品”和“折扣”。 然后我为多对多关系创建一个连接表'discount_product'。到目前为止一切顺利。

现在,如果我想为所有产品提供折扣,我必须为我拥有的尽可能多的产品插入连接表。这意味着拥有 10000 多种产品我必须在连接表中插入 10000 多行以获得一个折扣?这只是一个折扣!如果我有 1000 个呢?

当我在 'Discounts' 表中只有一列 'product_ids' 和类似 '1|2|4|7|23|.. .'(或 '*' 表示 'belongs to all')然后编写一小段 PHP 代码来检查折扣是属于所有产品还是属于某些产品。我知道这是错误的做法。那么有没有更好的方法来正确地做到这一点?

结构:

**products**
  id 
  description
  price

**discounts**
  id
  procent
  value

**discount_product**
  product_id
  discount_id

【问题讨论】:

  • 你有一些代码、Controller、Model、Repo、View吗?
  • 还没有,我只是将一个站点迁移到 Laravel 并希望以正确的方式进行。我只是想到一个概念。但实际上没关系,我肯定会拥有产品和折扣的所有模型和控制器以及迁移,但这并不能解决问题。
  • 一个产品可以有超过1个折扣?
  • 是的,当然。例如,可以有适用于一种或多种或所有产品的个人折扣。
  • 为什么是多对多? 1 个产品有 1 个折扣,如果它的 0 或 10 或 20% 折扣,它只有 1 个折扣,所以只有 1 个一个枢轴记录。因此,每个产品始终通过枢轴有 1 个“连接”。如果某些产品,例如 100 必须是全部 20% 的折扣,您必须在控制器和存储库中执行此操作。多次更新。希望你能理解。

标签: database laravel many-to-many relationships


【解决方案1】:

我建议尝试改变一些业务逻辑。

  • 如果折扣不在discount_product 中,则这意味着它适用于所有产品。
  • 如果折扣在discount_product 中,则表示它仅适用于特定产品。
  • 如果您需要确保折扣不适用于任何产品,请在折扣中添加字段 is_active。

这只是我的想法。

我相信有时由于优化而对数据库进行非规范化很有用,我会按照您对product_ids 字段的建议进行操作。

【讨论】:

  • 感谢您的评论。我之前考虑过,在这种情况下,我们不能通过 $this->belongsToMany('Product'); 来使用 Laravel 原生的多对多关系。它只是行不通....而且我知道以错误的方式使它很诱人:),如果我找不到更好的解决方案,我可能会这样做...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2018-06-15
  • 2018-01-22
  • 2016-02-26
  • 2016-01-04
相关资源
最近更新 更多