【发布时间】:2020-01-25 03:18:11
【问题描述】:
我有一个 laravel 应用程序,其中包含可以与报价相关联的产品。
我的问题是报价几乎和订单一样
因此,当报价被接受时,我将所有值从报价转储到订单,并将所有项目重新关联到订单而不是报价。
我计划在订单上创建一个类型字段,然后将类型从报价更改为订单,但是这样做很难对产品关系运行雄辩的查询,例如......
判断产品是否售出:Products::has('order');
实现此设计的正确方法是什么?
【问题讨论】:
我有一个 laravel 应用程序,其中包含可以与报价相关联的产品。
我的问题是报价几乎和订单一样
因此,当报价被接受时,我将所有值从报价转储到订单,并将所有项目重新关联到订单而不是报价。
我计划在订单上创建一个类型字段,然后将类型从报价更改为订单,但是这样做很难对产品关系运行雄辩的查询,例如......
判断产品是否售出:Products::has('order');
实现此设计的正确方法是什么?
【问题讨论】:
您可以通过对关系应用额外的约束来做到这一点。
class Product extends Model
{
/**
* Get the orders for the product.
*/
public function orders()
{
return $this->hasMany('App\Order')->where('type', '=', 'order');
}
/**
* Get the quotes for the product.
*/
public function quotes()
{
return $this->hasMany('App\Order')->where('type', '=', 'quote');
}
}
现在您可以使用以下代码查看产品的报价和订单
Product::has('quotes');
Product::has('orders');
如果不想在relation方法中写额外的约束,只添加orders()关系,那么可以在需要的时候使用whereHas()方法。
$orders = Product::whereHas('orders', function (Builder $query) {
$query->where('type', '=', 'order');
})->get();
$orders = Product::whereHas('orders', function (Builder $query) {
$query->where('type', '=', 'quote');
})->get();
【讨论】:
如果您想同时保留订单和引号,您可以创建多个 N-N 关系或单个 N-N 多态关系
product 1-N quote N-1 order_data
product 1-N order N-1 order_data
Order_data 包含有关订单的所有信息。定义订单类型的报价单和订单表。
如果您还计划引入其他类型的客户请求,例如信用票据和其他附加信息。您应该考虑创建多态关系。
Product 1-N order_type N-N order_data
您可以创建具有多个关系的订单数据。所以 orderType 的报价单、订单和信用可以同时存在,这对文档很重要。
【讨论】: