WhereHas Laravel 中的关系计数条件是啥

Posted

技术标签:

【中文标题】WhereHas Laravel 中的关系计数条件是啥【英文标题】:What is relationship count condition in WhereHas LaravelWhereHas Laravel 中的关系计数条件是什么 【发布时间】:2015-10-15 22:20:49 【问题描述】:

我很难理解WhereHas 中的关系计数条件。文档页面没有讨论它,但API page 谈论它。引用自 API。

Builder|Builder whereHas(string $relation, Closure $callback, string $operator = '>=', int $count = 1)

使用 where 子句向查询添加关系计数条件。

示例

Resource 模型与 ResourceCategory 具有多对多关系

public function categories()

    return $this->belongsToMany('ResourceCategory', 'resource_category_mapping');

Has 中的关系条件

Has 中的关系条件按预期工作。

Resource::has('categories', '>', 1)->get()
//this return all resources which have more than one catgories

WhereHas 中的关系条件

WhereHas 中的关系条件未按预期工作。我确定我理解错了。

Resource::whereHas('categories', function ( $query)
            $query->whereIn('resource_category_id', [1, 2, 4]);
        , '>', 1)->get()

上述代码应返回类别属于 [1, 2, 4] 之一且资源具有多个类别的资源。但事实并非如此。

问题

请解释 WhereHas 中的关系条件,提供示例可能会很有帮助。

【问题讨论】:

【参考方案1】:

通常,whereHas() 会检查您的模型是否有至少一个相关的模型。您可以将 $count 设置为更高的值,以将计数增加到 N,并仅获取至少具有 N 个相关模型的模型。

在你的情况下,调用

Resource::has('categories', '>', 2)->get();

将仅返回具有至少 2 个相关类别的那些资源

【讨论】:

您能否验证我对 whereHas 代码的解释“上述代码应返回其类别属于 [1, 2, 4] 且资源具有多个类别的资源”。是这样吗……? 为我工作。请粘贴您获得的查询 - 将 get() 替换为 toSql() - 并将其粘贴到此处。 select * from resource 其中resource.deleted_at 为空且first_name = ?和 (select count(*) from resource_category inner join resource_category_mapping on resource_category.id = resource_category_mapping.resource_category_id where resource_category_mapping.resource_id = resource.@987654335 987654336@ in (?, ?, ?, ?)) = 3 那个=3 是从哪里来的?你加了这个吗?除了这个,查询看起来还可以。 好吧,我明白了。它工作得很好。实际上,我很难理解与 WhereHas 的关系计数工作。我已经测试了很多案例并玩了一段时间,现在我得到了理解。非常感谢您的帮助。

以上是关于WhereHas Laravel 中的关系计数条件是啥的主要内容,如果未能解决你的问题,请参考以下文章

Laravel whereHas 检查嵌套关系中的最后一条最新记录

Laravel 的 whereHas 表现不佳

Laravel - 使用“whereHas”获取嵌套关系

Laravel:具有 whereHas 和多对多关系的全局范围

Laravel 多个 whereHas 关系标准

Laravel 递归 whereHas on BelongsToMany 关系