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 * fromresource
其中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 检查嵌套关系中的最后一条最新记录