我有一个雄辩的查询:
$model->select(
'product_templates.id',
'product_templates.name',
'product_templates.short_name',
'product_templates.code',
)
->withWhereHas('products', function ($query) {
$query->select(
'products.id',
'products.product_template_id',
'products.category_id',
'products.sub_category_id',
'products.company_id',
'products.product_size_id',
'products.expire_date',
)
->when(request('sub_category_id'), function ($query) {
$query->where('sub_category_id', request('sub_category_id'));
})
->where('company_id', request('company_id'))
->where('category_id', request('category'))
->with('productSize:id,name')
->withSum('stocks', 'quantity')
->withSum('orderItems', 'quantity');
})
->orderBy('name')
->get();
输出:
[{
"id": 1,
"name": "ABIES CANADENSIS-PINUS CANADENSIS",
"short_name": "ABIES-C",
"code": "1",
"pt_image": "uploads/product-templates/1667768874.jpg",
"products": [
{
"id": 1,
"product_template_id": 1,
"category_id": 1,
"sub_category_id": 1,
"company_id": 1,
"product_power_id": null,
"product_size_id": 6,
"expire_date": "2024-06-28T00:00:00.000000Z",
"stocks_sum_quantity": "346",
"order_items_sum_qty": null,
"price": {},
"product_power": null,
"product_size": {
"id": 6,
"name": "30 ML"
}
},
{
"id": 2,
"product_template_id": 1,
"category_id": 1,
"sub_category_id": 1,
"company_id": 1,
"product_power_id": null,
"product_size_id": 7,
"expire_date": "2023-05-03T00:00:00.000000Z",
"stocks_sum_quantity": "194",
"order_items_sum_qty": null,
"price": {},
"product_power": null,
"product_size": {
"id": 7,
"name": "100 ML"
}
},
{
"id": 3,
"product_template_id": 1,
"category_id": 1,
"sub_category_id": 1,
"company_id": 1,
"product_power_id": null,
"product_size_id": 15,
"expire_date": "2024-06-18T00:00:00.000000Z",
"stocks_sum_quantity": "237",
"order_items_sum_qty": null,
"price": {
"id": 3,
"product_id": 3,
"shop_id": 1,
"mrp": 110,
"selling_price": 115,
"purchase_price": 100,
"created_at": "2023-04-21T13:55:14.000000Z",
"updated_at": "2023-04-21T13:55:14.000000Z"
},
"product_power": null,
"product_size": {
"id": 15,
"name": "1000 ML"
}
}]
},
{
"id": 2,
"name": "ABIES NIGRA",
"short_name": "ABIES-N",
"code": "2",
"pt_image": "uploads/product-templates/1547250735.jpg",
"products": [
{
"id": 51,
"product_template_id": 2,
"category_id": 1,
"sub_category_id": 1,
"company_id": 1,
"product_power_id": null,
"product_size_id": 6,
"expire_date": "2023-11-12T00:00:00.000000Z",
"stocks_sum_quantity": "324",
"order_items_sum_qty": null,
"price": {
"id": 51,
"product_id": 51,
"shop_id": 1,
"mrp": 110,
"selling_price": 115,
"purchase_price": 100,
"created_at": "2023-04-21T13:55:16.000000Z",
"updated_at": "2023-04-21T13:55:16.000000Z"
},
"product_power": null,
"product_size": {
"id": 6,
"name": "30 ML"
}
},
{
"id": 52,
"product_template_id": 2,
"category_id": 1,
"sub_category_id": 1,
"company_id": 1,
"product_power_id": null,
"product_size_id": 7,
"expire_date": "2024-10-01T00:00:00.000000Z",
"stocks_sum_quantity": "203",
"o]rder_items_sum_qty": null,
"price": {
"id": 52,
"product_id": 52,
"shop_id": 1,
"mrp": 110,
"selling_price": 115,
"purchase_price": 100,
"created_at": "2023-04-21T13:55:16.000000Z",
"updated_at": "2023-04-21T13:55:16.000000Z"
},
"product_power": null,
"product_size": {
"id": 7,
"name": "100 ML"
}
},
{
"id": 53,
"product_template_id": 2,
"category_id": 1,
"sub_category_id": 1,
"company_id": 1,
"product_power_id": null,
"product_size_id": 15,
"expire_date": "2024-08-07T00:00:00.000000Z",
"stocks_sum_quantity": "143",
"order_items_sum_qty": null,
"price": {
"id": 53,
"product_id": 53,
"shop_id": 1,
"mrp": 110,
"selling_price": 115,
"purchase_price": 100,
"created_at": "2023-04-21T13:55:16.000000Z",
"updated_at": "2023-04-21T13:55:16.000000Z"
},
"product_power": null,
"product_size": {
"id": 15,
"name": "1000 ML"
}
}]
},
现在如何在不改变输出结果的情况下通过 QueryBuilder 实现这个查询?
我这样试:
return Product::query()
->select(
'products.*',
)
->where('products.category_id', request()->category)
->when($subCategoryId = request('sub_category_id'), function ($query) use ($subCategoryId) {
$query->where('products.sub_category_id', $subCategoryId);
})
->when($companyId = request('company_id'), function ($query) use ($companyId) {
$query->where('products.company_id', $companyId);
})
->join('sub_categories', 'sub_categories.id', '=', 'products.sub_category_id')
->join('product_sizes', 'product_sizes.id', '=', 'products.product_size_id')
->join('product_templates', function($join){
$join->on('product_templates.id', '=', 'products.product_template_id');
$join->on('product_template_images.product_template_id', '=', 'product_templates.id');
})
->orderBy('product_templates.name')
->get();
但是输出结果是plain collections。