Laravel多个哪里有关系的标准

use*_*951 5 relationship laravel eloquent

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

联系表

id    | name          
----- | -------
1     | Joe
2     | Sally
Run Code Online (Sandbox Code Playgroud)

访问表

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
Run Code Online (Sandbox Code Playgroud)

使用eloquent,我想检索所有具有路径名 ='注册'和引用者 ='谷歌'的联系人.

到目前为止我得到的是:

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

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

但是,这个例子也会检索Sally(来自上面的示例表),因为她访问了注册,但没有被谷歌引用.我需要一种方法来只检索Joe,他既是谷歌和访问定价.

有任何想法吗?提前致谢!

Mar*_*łek 12

您可以使用:

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


Dar*_*phy 8

上面代码的精炼版:

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

需要注意的几点:

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