Laravel多个哪里有关系的标准

时间:2014-10-04 16:29:08

标签: laravel eloquent relationship

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

联系人表

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,我想检索所有路径名 ='注册'和推荐人 =' google'。

到目前为止,我得到的是:

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

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

但是,此示例还会检索 Sally (来自上面的示例表),因为她访问了注册,但未被谷歌推荐。我需要一种方法来只检索 Joe ,这两者都是谷歌和访问定价。

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

2 个答案:

答案 0 :(得分:9)

您可以使用:

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

答案 1 :(得分:4)

以上代码的精炼版本:

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

几个值得注意的要点:

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