如何通过在 Laravel 中对库存单位进行分组来找到畅销书?

Posted

技术标签:

【中文标题】如何通过在 Laravel 中对库存单位进行分组来找到畅销书?【英文标题】:How can I find the best sellers by grouping stock units in Laravel? 【发布时间】:2019-06-10 23:11:27 【问题描述】:

我正在尝试根据在该产品上创建的库存单位数量来选择最畅销的产品。产品的库存单位越多 = 销售量就越多。

我的 product_list 表如下所示:

Schema::create('product_list', function (Blueprint $table) 
    $table->increments('id');
    $table->decimal('cost', 9, 2)->default(00.00);
    $table->integer('product_category')->unsigned();            # IE Bespoke/Static/Dynamic
    $table->integer('product_type')->unsigned();                # IE Themes(Custom Or Not)/Number of pages
    $table->integer('product_score')->default(0);               # How many favourites does it have?
    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

    $table->index(array('product_category', 'product_type'));

    $table->foreign('product_category')->references('id')->on('product_categories');
    $table->foreign('product_type')->references('id')->on('product_types')->onDelete('cascade');
    );

我的 products_skus 表如下所示:

Schema::create('product_skus', function (Blueprint $table) 
    $table->increments('id');
    $table->string('reference');
    $table->integer('product_id')->unsigned();
    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

    $table->index(array('product_id'));

    $table->foreign('product_id')->references('id')->on('product_list')->onDelete('cascade');
);

这是我迄今为止使用 Eloquent 所尝试的方法 - 目前并不太在意让任何其他加入,只是让最畅销的产品工作:

$topSellers = DB::table('product_list')->join('product_skus', 'product_skus.product_id', '=', 'product_list.id')
                                       ->groupBy('product_skus.product_id')
                                       ->limit(5)
                                       ->get()
                                       ->all();

这给了我这个错误:

SQLSTATE[42000]:语法错误或访问冲突:1055 'iezonsolutions.product_list.id' 不在 GROUP BY (42000) 中

如何找到最畅销的商品?我在每个 product_item 售出时为其创建一个 SKU,这是一种跟踪畅销商品并为用户提供独特跟踪能力的方式。

更新以显示关系

product_skus 有一个外键 product_id,它与 product_list 表列 id 相关。我想根据产品 id 的关系对库存单位进行分组。最多 SKU 分组到该单个产品 id,我想从 product_list 表中获取它们的产品

$topSellers = DB::table('product_skus')->join('product_list', 'product_skus.product_id', '=', 'product_list.id')
                                       ->orderBy('product_skus.product_id')
                                       ->limit(5)
                                       ->get()
                                       ->all();

现在正在对正确的关系进行分组,但是,它给了我一个

的输出
array:3 [▼
  0 => #725 ▼
    +"id": 2
    +"reference": "A400IEZON_"
    +"product_id": 2
    +"created_at": "2019-01-16 16:37:16"
    +"updated_at": "2019-01-16 16:37:16"
    +"cost": "100.00"
    +"product_category": 1
    +"product_type": 2
    +"product_score": 0
    +"rating": 0
    +"down_payment": "10.00"
  
  1 => #726 ▼
    +"id": 3
    +"reference": "C400IEZON_"
    +"product_id": 3
    +"created_at": "2019-01-16 16:37:25"
    +"updated_at": "2019-01-16 16:37:25"
    +"cost": "150.00"
    +"product_category": 1
    +"product_type": 3
    +"product_score": 0
    +"rating": 0
    +"down_payment": "10.00"
  
  2 => #727 ▼
    +"id": 3
    +"reference": "C400IEZON_"
    +"product_id": 3
    +"created_at": "2019-01-16 16:37:25"
    +"updated_at": "2019-01-16 16:37:25"
    +"cost": "150.00"
    +"product_category": 1
    +"product_type": 3
    +"product_score": 0
    +"rating": 0
    +"down_payment": "10.00"
  
]

我想计算所有这些,所以在这里,带有id 3 的产品应该显示为顶部产品,然后是产品 2。

【问题讨论】:

product_list 和 product_skus(模型)之间有什么关系吗? 不,product_skusproduct_list 有关系。但是,我想首先选择与产品关系最多的所有product_skus,然后选择前 5 个产品 - 这么说,我想我需要 2 个单独的查询 @Mozammil 你能发布关系吗?给你看会更容易:) 更新了问题,感谢@Mozammil 【参考方案1】:

您可以使用子查询来实现此目的。

$skus = ProductSku::selectRaw('COUNT(*)')
    ->whereColumn('product_id', 'product_list.id')
    ->getQuery();

$products = ProductList::select('*')
    ->selectSub($skus, 'skus_count')
    ->orderBy('skus_count', 'DESC')
    ->take(5)
    ->get();

如果ProductListProductSku 有关系,这会容易得多。 然后你可以这样做:

例如在App\ProductList,你可以有这样的东西:

public function skus()

    return $this->hasMany(ProductSku::class);

.. 那么,您的查询将是:

ProductList::withCount('skus') 
    ->orderBy('skus_count', 'DESC')
    ->take(5)
    ->get();

.. 这将产生与上面相同的查询。我不完全确定您的型号名称。你应该相应地改变它。

【讨论】:

非常感谢如此!我使用第一个解决方案只是因为我在数据库中的基础设施。这给了我确切的预期输出!我会尽快标记

以上是关于如何通过在 Laravel 中对库存单位进行分组来找到畅销书?的主要内容,如果未能解决你的问题,请参考以下文章

通过在 Raku 中对它们的值进行分组来打印散列元素

如何在每个循环中对 Json 对象进行分组

在 Express 中对路线进行分组

如何在magento中对库存状态的产品集合进行排序

如何在laravel中对相关模型进行分页

在 Laravel 中对分页变量进行排序