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();}])
但是没用
您可以在子查询中使用“whereHas”函数进行过滤。
1.) whereHas
https://laravel.com/docs/10.x/eloquent-relationships#querying-relationship-existence
使用
whereHas
- 你仍然会得到记录,但是相关表的数组将被过滤。
您的代码示例:
$categories =
Partner::restaurants()
->whereHas('rootCategory', function (Builder $query) {
$query->descendants()->whereDepth('>', 1)->exists();
})
->get()
->pluck('rootCategory');
2.) withWhereHas
使用
withWhereHas
- 如果不满足相关表的条件,您将不会获得记录
您的代码示例:
$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');