Laravel 复杂查询更改 Eloquent 为 Query Builder

问题描述 投票:0回答:0

我有一个雄辩的查询:

$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。

php laravel laravel-query-builder
© www.soinside.com 2019 - 2024. All rights reserved.