【问题标题】:Laravel Architecture, several similar models to be combined?Laravel 架构,几个类似的模型要组合?
【发布时间】:2020-01-25 03:18:11
【问题描述】:

我有一个 laravel 应用程序,其中包含可以与报价相关联的产品。

我的问题是报价几乎和订单一样

因此,当报价被接受时,我将所有值从报价转储到订单,并将所有项目重新关联到订单而不是报价。

我计划在订单上创建一个类型字段,然后将类型从报价更改为订单,但是这样做很难对产品关系运行雄辩的查询,例如......

判断产品是否售出:Products::has('order');

实现此设计的正确方法是什么?

【问题讨论】:

    标签: database laravel eloquent


    【解决方案1】:

    您可以通过对关系应用额外的约束来做到这一点。

    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();
    

    【讨论】:

    • 正是需要的!谢谢
    【解决方案2】:

    如果您想同时保留订单和引号,您可以创建多个 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
    
    • 产品:包含产品信息
    • Order_data:代表不同的客户输入
    • Order_type:不同的订单关系

    您可以创建具有多个关系的订单数据。所以 orderType 的报价单、订单和信用可以同时存在,这对文档很重要。

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2012-07-26
      • 2020-10-19
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多