【问题标题】:Database: Relation between Orders and Items数据库:订单和项目之间的关系
【发布时间】:2018-08-17 14:13:57
【问题描述】:

一篇文章解释:

一对多

“一个给定的订单可能包含许多项目。一个给定的项目 属于一个且只有一个订单。”

这里,“给定项目”是指一个特定项目?因为我们可以在库存中有多个数量的特定项目。 但我是这样想的:

一个商品有很多订单,一个订单包含很多商品。

难道不是多对多的关系吗?

下面是我的订单表:

+------------+--------------+------+-----+-------------------+-------+
| Field      | Type         | Null | Key | Default           | Extra |
+------------+--------------+------+-----+-------------------+-------+
| id         | int(11)      | NO   | PRI | NULL              |       |
| customerId | int(11)      | YES  | MUL | NULL              |       |
| itemId     | int(11)      | YES  | MUL | NULL              |       |
| quantity   | int(11)      | NO   |     | NULL              |       |
| date       | timestamp    | NO   |     | CURRENT_TIMESTAMP |       |
+------------+--------------+------+-----+-------------------+-------+

物品表:

    +------------+---------------+------+-----+-------------------+----------------+
| Field      | Type          | Null | Key | Default           | Extra          |
+------------+---------------+------+-----+-------------------+----------------+
| id         | int(11)       | NO   | PRI | NULL              | auto_increment |
| name       | varchar(255)  | NO   |     | NULL              |                |
| price      | decimal(10,2) | NO   |     | NULL              |                |
| stock      | int(11)       | NO   |     | NULL              |                |
| supplierId | int(11)       | YES  | MUL | NULL              |                |
| date       | timestamp     | NO   |     | CURRENT_TIMESTAMP |                |
+------------+---------------+------+-----+-------------------+----------------+

【问题讨论】:

    标签: mysql database laravel eloquent


    【解决方案1】:

    我所做的就是把它当作orders -> order_items -> items。一个订单可以有多个订单项目,每个订单项目都属于一个项目。

    表结构应该是

    orders

    • 身份证
    • customer_id
    • 日期

    order_items

    • 身份证
    • order_id
    • item_id
    • 数量
    • 价格

    items

    • 身份证
    • 姓名
    • 价格
    • 库存
    • 供应商标识
    • 日期

    在代码中你可以做这样的事情

    应用/订单

    class Order extends Model {
    
       public function orderItems(){
          $this->hasMany(OrderItem::class);
       }
    }
    

    App\OrderItem

    class OrderItem extends Model{
    
        public function order(){
          $this->belongsTo(Order::class);
        }
        public function item(){
          $this->belongsTo(Item::class);
        }
    }
    

    应用\项目

    class Item extends Model{
    
        public function orderItems(){
          $this->hasMany(orderItem::class)
        }
    
    }
    

    希望对您有所帮助!

    PS - 遵循 table_name_singular_id 命名约定作为外键名称,以便 laravel eloquent 在不传递列名的情况下工作

    【讨论】:

      【解决方案2】:

      您可能知道使用 Pivot 表可以实现多对多关系。

      只有在Pivot表中将项目数量存储为值时,它肯定是多对多关系

      架构可以如下-

      顺序

      • id

      • 姓名

      物品

      • id

      • 姓名

      枢轴

      • order_id

      • item_id

      • 数量

      【讨论】:

        【解决方案3】:

        假设我有以下对象:-

        订单:A 和 B 项目:X、Y 和 Z

        现在订单 A 可能包含多个数量的商品 X,但每个不同的商品 x 都有一个唯一的序列号。

        因此,如果订单 A 有 3 件商品 X,实际上它包含 3 个不同的商品,名称相同但制造 ID/序列号不同,例如

        序列号为 1 的项目 X 序列号为 2 的项目 X 序列号为 3 的项目 X

        并且它们都链接到具有唯一序列号的 Ordex A。

        多对多关系的一个很好的例子是组织中的员工和团队,其中员工作为多个团队的一部分工作。

        【讨论】:

          【解决方案4】:

          数据库中没有多对多的关系。如果应该有它应该使用桥梁关系来完成。根据您的数据库表显示,它仍然显示一对多关系。一个特定的订单可能包含许多项目,因此表订单应该生成它自己的唯一实体。但它也包含项目 ID 的外国实体,其中有许多项目 ID。因此,一个表订单 ID 对应多个表项 ID。

          【讨论】:

          • 可以使用 Laravel 中的 Pivots 实现多对多关系。
          • @VaishnavMhetre pivots 实际上是一个桥梁实体。
          猜你喜欢
          • 1970-01-01
          • 2018-06-24
          • 2016-05-18
          • 1970-01-01
          • 2012-04-26
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          相关资源
          最近更新 更多