亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel:將子集合過濾回自身

Laravel:將子集合過濾回自身

PHP
Smart貓小萌 2023-09-08 14:21:36
我正在編寫一個搜索函數,它使用三個參數:品牌、型號和燃料類型。“make”參數是必需的,因此我首先使用下面的代碼將 make 及其相關模型選擇到集合中。// Find Make and Models$makeAndModels = Make::where('name', $request->make)->with('carmodels', 'carmodels.fueltype')->first();此時集合看起來像這樣:{    "id": 2,    "name": "Toyota",    "created_at": "2020-07-26T16:11:06.000000Z",    "updated_at": "2020-07-26T16:11:06.000000Z",    "carmodels": [        {            "id": 3,            "name": "Prius",            "make_id": 2,            "fueltype_id": 2,            "created_at": "2020-07-26T16:44:21.000000Z",            "updated_at": "2020-07-26T16:44:21.000000Z",            "fueltype": {                "id": 2,                "name": "Hybrid",                "created_at": "2020-07-26T16:11:06.000000Z",                "updated_at": "2020-07-26T16:11:06.000000Z"            }        },        {            "id": 4,            "name": "Hilux",            "make_id": 2,            "fueltype_id": 3,            "created_at": "2020-07-26T16:44:21.000000Z",            "updated_at": "2020-07-26T16:44:21.000000Z",            "fueltype": {                "id": 3,                "name": "Diesel",                "created_at": "2020-07-26T16:11:06.000000Z",                "updated_at": "2020-07-26T16:11:06.000000Z"            }        }    ]}然后,我想按名稱和燃料類型過濾“汽車模型”子集合,將過濾后的數據返回到其原始集合,而不是返回到新集合。這些過濾器僅應在提供了附加參數的情況下運行,我當前使用的代碼如下所示。        //Filter Models By Additional Parameters            //Model            if ($request->model) {                $model = $request->model;                $makeAndModels->carmodels = $makeAndModels->carmodels->filter()->where('name', $model);            }由于某種原因,這種過濾方式不會覆蓋原始集合,例如,如果我過濾到新的子集合,        //Filter Models By Additional Paramters            //Model            if ($request->model) {                $model = $request->model;                $makeAndModels->carmodelsFiltered = $makeAndModels->carmodels->filter()->where('name', $model);            }它產生以下結果,所以我知道過濾器應該起作用。
查看完整描述

1 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

您可以with()使用數組作為第一個參數的調用來過濾它們。如果您傳遞包含的鍵和closures查詢的鍵,則可以在其中查詢關系。這些closures在您的情況下非常通用,我在數組之前定義了 it,因為這兩種情況都是相同的。


這與您現在查詢數據庫不同,但這具有更好的性能,因為您不必取出所有數據。


$model = $request->model;


$nameFilter = function ($query) use ($model) {

    $query->when($model, function ($query) use ($model) {

        $query->where('name', $model);

    });

};


$makeAndModels = Make::when($model, function ($query) use ($model) {

    $query->where('name', $model);

})->with(

    [

        'carmodels' => $nameFilter,

        'carmodels.fueltype' => $nameFilter,

    ]

)->first();

更新


僅當名稱存在時才過濾數據庫,Laravel有when()調用,僅在滿足布爾條件時才執行查詢。


查看完整回答
反對 回復 2023-09-08
  • 1 回答
  • 0 關注
  • 123 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號