laravel 邻接列表 - 获取子查询存在的深度

问题描述 投票:0回答:1

rootCategory 是 HasOne 关系:

public function rootCategory()
{
    return $this->hasOne(PartnerCategory::class, 'partner_id', 'id')->where('partner_category_main', 1);
}

然后:

$categories = Partner::restaurants()->with('rootCategory')->get()->pluck('rootCategory')

然后我需要知道 rootCategory 是否有深度 >1 的孩子并且在 CategoryResource 中做:

$this->descendants()->whereDepth('>', 1)->exists()

但它提出了更多的查询。我怎样才能同时查询 rootCategory 关系?

我试过了

with(['rootCategory' => function($q) {return $q->descendants();}])
但是没用

laravel recursive-query adjacency-list
1个回答
0
投票

子查询中的过滤器 - WhereHas

您可以在子查询中使用“whereHas”函数进行过滤。

1.) whereHas

https://laravel.com/docs/10.x/eloquent-relationships#querying-relationship-existence

使用

whereHas
- 你仍然会得到记录,但是相关表的数组将被过滤。

  • 可以通过SQL过滤(where等)

您的代码示例:

$categories =
  Partner::restaurants()
    ->whereHas('rootCategory', function (Builder $query) {
       $query->descendants()->whereDepth('>', 1)->exists();
    })
    ->get()
    ->pluck('rootCategory');

2.) withWhereHas

https://laravel.com/docs/10.x/eloquent-relationships#constraining-eager-loads-with-relationship-existence

使用

withWhereHas
- 如果不满足相关表的条件,您将不会获得记录

  • 可以通过SQL过滤(where等)

您的代码示例:

$categories =
  Partner::restaurants()
    ->withWhereHas('rootCategory', function (Builder $query) {
       $query->descendants()->whereDepth('>', 1)->exists();
    })
    ->get()
    ->pluck('rootCategory');

3.) 有

https://laravel.com/docs/10.x/eloquent-relationships#querying-relationship-existence

使用

has
- 如果你想根据记录号检索记录,你可以在这里指定它。

  • 可以按行数过滤

您的代码示例:

$categories =
  Partner::restaurants()
    ->with('rootCategory')
    ->has('rootCategory', '>', 0)
    ->get()
    ->pluck('rootCategory');
© www.soinside.com 2019 - 2024. All rights reserved.