簡體   English   中英

Laravel Eloquent - 使用過濾數據獲取嵌套關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM