Laravel在“ orWhere”中使用“ like”运算符链接“ wherenotin”

时间:2018-08-07 21:33:46

标签: php mysql laravel

我正在尝试获取allParticipants数组中不存在的用户列表,但其名称,电子邮件或用户名与input匹配。以下是我尝试过的

User::where('username', $input)
                    ->orWhere('email', $input)
                    ->orWhere('name', 'LIKE', '%' . $input . '%')
                    ->whereNotIn('id', $allParticipants)->get()->toJson()->get();

但是,上面的方法将返回一个名称与输入匹配的用户列表,无论它们是否存在于allParticipants数组中。编写此查询的正确方法是什么。

1 个答案:

答案 0 :(得分:0)

检查您的查询:

您告诉Laravel获得 [A] 不在特定参与者组中的用户列表 OR [B] 具有特定email的用户 OR [C] 具有特定name的用户..因此,翻译为:< / p>

[A] OR [B] OR [C]

这就是为什么当Laravel找到与提供的电子邮件匹配的user电子邮件时,无论是否属于该特定组($appParticipants)的电子邮件,它都会返回。

解决方案

要获得所需的行为,您应该改为执行以下操作:

User::where('username', $input)
    ->whereNotIn('id', $allParticipants)
    ->where(function ($query) use ($input) {
        $query
            ->where('email', $input)
            ->orWhere('name', 'LIKE', '%' . $input . '%');
    })
    ->get()
    ->toJson()
    ->get();

这将执行以下操作:

[A] 检查ID不在$allParticipants数组中的用户 AND 遵循下一条规则: [B] 具有特定的email [C] 具有特定的name

[A] AND ([B] OR [C])