如何给 "where" 与 laravel 相关的数据

How to give "where" in relation data with laravel

我有这个数据

"sales_order_id": 25,
"reff_id": null,
"customer_id": 1,
"logistics_id": 3,
"discount_code": null,
"subtotal": 1800000,
"shipping_cost": 0,
"discount_amount": 0,
"tax": "0",
"status": "Open",
"date_of_sales": "2021-11-09",
"grand_total": 1800000,
"users_id": 1,
"product_sales": [
    {
    "product_sales_order_id": 72,
    "sales_order_id": 25,
    "product_id": 1,
    "price": 51000,
    "qty_order": "10.00",
    "bonus_item": 0,
    "discount": 0,
    "total": 0
    },
    {
    "product_sales_order_id": 73,
    "sales_order_id": 25,
    "product_id": 1,
    "price": 51000,
    "qty_order": "1.00",
    "bonus_item": 1,
    "discount": 0,
    "total": 0
    },
    {
    "product_sales_order_id": 74,
    "sales_order_id": 25,
    "product_id": 2,
    "price": 129000,
    "qty_order": "1.00",
    "bonus_item": 1,
    "discount": 0,
    "total": 0
    },
]

我只想用“bonus_item”= 1 销售产品,这是我的 Laravel 代码

$bonus_item = SalesOrder::with(['product_sales'])
    ->whereHas('product_sales', function($query){
        $query->where('bonus_item', '=', true);
    })
    ->get();

如何在关系数据中使用“Where”子句?我尝试使用“WhereRelation”,但只能像那里的代码一样工作。

就像@lagbox说的,你可以使用constraining eager loading,它的语法与whereHas方法有点不同。

你可以这样做:

$bonus_item = SalesOrder::whereHas('product_sales', function ($query) {
    $query->where('bonus_item', true);
})->with(['product_sales' => function ($query) {
    $query->where('bonus_item', true);
}])->get();

对于文档中的示例:https://laravel.com/docs/master/eloquent-relationships#constraining-eager-loads