Laravel 订单数据库架构咨询

Laravel orders database architecture advice

我一直在为一个 Laravel 5.8 应用程序设置一个订单系统,但我认为我已经使订单系统的数据库架构过于复杂(或没有)。

我创建了以下 tables:orderorder_itemsproductsservicesprices,当然还使用了users table 作为 'client'.

我现在的疑问是将 productsservices 作为单独的 table 还是仅在新的 items 上使用,这将说明该项目是否是'product' 或 'service'.

这是因为在为 Order::classOrderItem::class 模型建立模型关系时,我似乎陷入了 'knot'.

我的 table 如下:

订单

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| guid        | varchar(191)        | NO   |     | NULL    |                |
| user_id     | int(10) unsigned    | YES  | MUL | NULL    |                |
| firm_id     | bigint(20) unsigned | YES  | MUL | NULL    |                |
| currency_id | int(10) unsigned    | YES  | MUL | 1       |                |
| total       | double(8,2)         | NO   |     | 0.00    |                |
| status      | varchar(191)        | YES  |     | NULL    |                |
| created_at  | timestamp           | YES  |     | NULL    |                |
| updated_at  | timestamp           | YES  |     | NULL    |                |
| deleted_at  | timestamp           | YES  |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

order_items

+---------------+---------------------+------+-----+---------+----------------+
| Field         | Type                | Null | Key | Default | Extra          |
+---------------+---------------------+------+-----+---------+----------------+
| id            | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| product_id    | int(10) unsigned    | YES  | MUL | NULL    |                |
| service_id    | bigint(20) unsigned | YES  | MUL | NULL    |                |
| order_id      | bigint(20) unsigned | NO   | MUL | NULL    |                |
| quantity      | double(8,2)         | NO   |     | 1.00    |                |
| quantity_type | varchar(191)        | YES  |     | NULL    |                |
| notes         | varchar(191)        | YES  |     | NULL    |                |
| created_at    | timestamp           | YES  |     | NULL    |                |
| updated_at    | timestamp           | YES  |     | NULL    |                |
| deleted_at    | timestamp           | YES  |     | NULL    |                |
+---------------+---------------------+------+-----+---------+----------------+    

产品

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| guid         | varchar(191)        | NO   | UNI | NULL    |                |
| name         | varchar(191)        | NO   |     | NULL    |                |
| name_slug    | varchar(191)        | NO   |     | NULL    |                |
| details      | text                | NO   |     | NULL    |                |
| has_shipment | tinyint(1)          | NO   |     | NULL    |                |
| created_at   | timestamp           | YES  |     | NULL    |                |
| updated_at   | timestamp           | YES  |     | NULL    |                |
| deleted_at   | timestamp           | YES  |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

服务

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| guid        | varchar(191)        | NO   | UNI | NULL    |                |
| name        | varchar(191)        | NO   |     | NULL    |                |
| name_slug   | varchar(191)        | NO   |     | NULL    |                |
| description | text                | NO   |     | NULL    |                |
| created_at  | timestamp           | YES  |     | NULL    |                |
| updated_at  | timestamp           | YES  |     | NULL    |                |
| deleted_at  | timestamp           | YES  |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+ 

价格

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| product_id  | int(11)             | YES  | MUL | NULL    |                |
| service_id  | bigint(20) unsigned | YES  | MUL | NULL    |                |
| currency_id | int(10) unsigned    | YES  | MUL | NULL    |                |
| value       | double(8,2)         | YES  |     | NULL    |                |
| created_at  | timestamp           | YES  |     | NULL    |                |
| updated_at  | timestamp           | YES  |     | NULL    |                |
| deleted_at  | timestamp           | YES  |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

用户(简体)

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| guid        | varchar(191)        | NO   | UNI | NULL    |                |
| name        | varchar(191)        | NO   |     | NULL    |                |
| name_slug   | varchar(191)        | NO   |     | NULL    |                |
| email       | varchar(191)        | NO   |     | NULL    |                |
| ...         | ...                 | ...  | ... | ...     | ...            |
| created_at  | timestamp           | YES  |     | NULL    |                |
| updated_at  | timestamp           | YES  |     | NULL    |                |
| deleted_at  | timestamp           | YES  |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

我的目标是让 订单 包含一个或多个 产品 and/or 服务,以及他们各自的用户价格。

示例: $order = Order::where('id', 1)->with('users', 'items', 'prices')->get();

但我可以获取 'Order'、'User'、'Items',但不能获取每个项目的 'Prices'。

我试过的

Order::classOrderItem::class 模型(例如:$this->belongsTo(Product::class))的不同关系方法,但似乎没有正确处理。

如上所述,我几乎可以买到所有东西,但不能买到价格。

问题:我是否应该将产品服务合并为一个table 并且有一列用于 type(如 serviceproduct)?

在此先感谢您的任何建议。

我认为合并这些表不是最好的方法。在我看来,这是多态关系的完美用法。根据 Laravel 的文档:

A polymorphic relationship allows the target model to belong to more than one type of model using a single association.

来源:https://laravel.com/docs/5.8/eloquent-relationships#polymorphic-relationships

看看https://laravel.com/docs/5.8/eloquent-relationships#many-to-many-polymorphic-relations。如果您有任何问题,请在此处发表评论。我很乐意帮助你。