如何通过在 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_skus
与product_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();
如果ProductList
与ProductSku
有关系,这会容易得多。
然后你可以这样做:
例如在App\ProductList
,你可以有这样的东西:
public function skus()
return $this->hasMany(ProductSku::class);
.. 那么,您的查询将是:
ProductList::withCount('skus')
->orderBy('skus_count', 'DESC')
->take(5)
->get();
.. 这将产生与上面相同的查询。我不完全确定您的型号名称。你应该相应地改变它。
【讨论】:
非常感谢如此!我使用第一个解决方案只是因为我在数据库中的基础设施。这给了我确切的预期输出!我会尽快标记以上是关于如何通过在 Laravel 中对库存单位进行分组来找到畅销书?的主要内容,如果未能解决你的问题,请参考以下文章