[英]Laravel Eloquent - Get nested relationships with filtered data
假設我有以下模型:
類別-(hasMany/belongsTo)-子類別-(hasMany/belongsTo)-產品
這些模型在前端創建了一個可折疊的產品列表,如下所示:
Category1
- Subcategory1
- Product1
- Product2
Category2
- SubCategory3
- Product4
現在,我想搜索 Product1 並檢索它,同時保持關系 Category->Subcategory->Product 不變,這樣我就可以像這樣輕松地打印出來:
Category1
- Subcategory1
- Product1
我知道通過以下查詢,您可以搜索具有特定條件的產品的所有類別:
<?php
$Categories = Categories::whereHas('subcategories', function ($q) use ($request) {
$q->whereHas('products', function ($q) use ($request) {
$q->where('name', 'LIKE', "%$request->search%")
->orWhere('article_number', 'LIKE', "%$request->search%");
});
})
->get();
?>
但這只會返回類別。
然后,我打算將它們變成具有以下資源 class 的集合,在我得知我實際上只從上面的查詢中獲取類別之前:
$Collection = CategoriesResource::collection($Categories);
//------------------------------------------------
class CategoriesResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'subcategories' => $this->subcategories()->with('products')->get(),
];
}
}
我的問題是,我是否可以事先使用不同的查詢,或者將條件傳遞給 with 語句,這樣我只會得到滿足搜索條件的產品? 理想情況下,我希望數據集中沒有空的類別或子類別,但如果它無法管理,那也沒關系。
我也嘗試通過直接搜索產品並獲取具有belongsTo關系的類別來反向嘗試,但是我不知道將Product->Categories反轉回Categories->Products的可行方法。
您可以在急切加載時重復相同的條件:
$Categories = Categories::whereHas('subcategories', function ($q) use ($request) {
$q->whereHas('products', function ($q) use ($request) {
$q->where('name', 'LIKE', "%$request->search%")
->orWhere('article_number', 'LIKE', "%$request->search%");
});
})->with(['subcategories'=> function ($q) use ($request) {
$q->with(['products'=>function ($q) use ($request) {
$q->where('name', 'LIKE', "%$request->search%")
->orWhere('article_number', 'LIKE', "%$request->search%");
}]);
}])->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.