繁体   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