我正在編寫一個搜索函數,它使用三個參數:品牌、型號和燃料類型。“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()調用,僅在滿足布爾條件時才執行查詢。
- 1 回答
- 0 關注
- 123 瀏覽
添加回答
舉報
0/150
提交
取消
