Laravel 多个 whereHas 关系标准

Posted

技术标签:

【中文标题】Laravel 多个 whereHas 关系标准【英文标题】:Laravel multiple whereHas criteria for relationship 【发布时间】:2014-11-29 10:42:20 【问题描述】:

我有两张表 - 联系人和访问:

联系人表

id    | name          
----- | -------
1     | Joe
2     | Sally

访问表

id    | contact_id | pathname  | referrer                
----- | -------    | -------   | -------
1     | 1          | about     | google
2     | 1          | pricing   | null
3     | 1          | signup    | null
4     | 2          | about     | null
5     | 2          | signup    | null

使用 eloquent,我想检索具有 路径名 = 'signup' 和 referrer = 'google 的所有 联系人 '。

到目前为止我得到的是:

Contact::whereHas('visits', function($query) 
    $query->where('pathname','=','signup');
)
->orWhereHas('visits', function($query) 
    $query->where('referrer','=','google');
)
->get();

正确检索访问过定价或注册页面的所有联系人。

但是,此示例也将检索 Sally(来自上面的示例表),因为她访问了注册,但未被 google 推荐。我需要一种方法来只检索 Joe,他既被 google 推荐,又被访问过定价。

有什么想法吗?提前致谢!

【问题讨论】:

【参考方案1】:

你可以使用:

Contact::whereHas('visits', function($query) 
    $query->where('pathname','=','signup');
)
->whereHas('visits', function($query) 
    $query->where('referrer','=','google');
)
->get();

【讨论】:

这正是我想要的。谢谢马辛!【参考方案2】:

上述代码的改进版:

Contact::whereHas('visits', function($query) 
    $query->where('pathname','signup')->where('referrer','google');
)->get();

几个值得注意的点:

    您可以在闭包中链接where() 子句。 where 子句的默认运算符是=,因此您可以省略它。 在访问多个相关模型时,使用多个 whereHas() 子句。

【讨论】:

以上是关于Laravel 多个 whereHas 关系标准的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Laravel - 搜索关系,包括 whereHas 中的 null

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

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

Laravel whereHas on Many-to-Many 关系