Php 使用OR运算符时,Laravel Eloquent WHERRAW sql子句返回所有行

Php 使用OR运算符时,Laravel Eloquent WHERRAW sql子句返回所有行,php,laravel,eloquent,Php,Laravel,Eloquent,在中,我使用获取与组关联的所有用户 (不幸的是,这是一个遗留数据库,因此它不遵循Laravel约定) users表中有一个列,其GroupId是组表的外键,其中包含用户所属组的相关信息 我想选择与两个特定组关联的所有用户,按其名称选择。当我在SQL语句的WHERRAW子句中不使用OR运算符时,它就会工作。在这种情况下,它只返回所有行,不管它们的名称如何 如果我删除了OR…,代码将按预期工作,并仅返回与GroupId i查询关联的用户,在本例中为“KO011” ('GroupId'的语义只是组名)

在中,我使用获取与组关联的所有用户

(不幸的是,这是一个遗留数据库,因此它不遵循Laravel约定)

users表中有一个列,其GroupId是组表的外键,其中包含用户所属组的相关信息

我想选择与两个特定组关联的所有用户,按其名称选择。当我在SQL语句的WHERRAW子句中不使用OR运算符时,它就会工作。在这种情况下,它只返回所有行,不管它们的名称如何

如果我删除了OR…,代码将按预期工作,并仅返回与GroupId i查询关联的用户,在本例中为“KO011”

('GroupId'的语义只是组名)

使用or运算符查询时的sql日志转储为(意外结果,所有行):

当我只查询一个组时(正确的结果):


您必须将这些
嵌套在何处
,并且为什么希望
在何处

->whereHas('Group', function($q)
{
    $q->where(function ($q) {
       $q->where('GroupId', 'KO11')->orWhere('GroupId', 'KO05');
    });
})
因为
whereHas
添加了类似
wherefk=?和…

另一种方式是:

$q->whereRaw("(GroupId = 'KO11' OR GroupId = 'KO05')")

嗨,你的第二个建议成功了!第一个返回所有行。我应该补充一点,我已经尝试过嵌套解决方案。这就是为什么我尝试使用whereRaw,尽管语法错误非常感谢!1st也可以工作,它产生完全相同的
(…或..)
工件。确保你做得对。啊,不正常。我忘了将查询放在回调中!我得买副新眼镜。。
[2014-11-28 17:57:26] local.INFO: select `name`, `surname`, `GroupId` from `Users` where (select count(*) from `Group` where `Users`.`GroupId` = `Group`.`Id` and GroupId = 'KO11') >= 1 {"bindings":[],"time":93.18,"name":"dbname"} []
[2014-11-28 17:57:26] local.INFO: select `Id`, `GroupId`, `GroupDescription` from `Group` where `Group`.`Id` in (3) {"bindings":[3],"time":405.02,"name":"dbname"} []
->whereHas('Group', function($q)
{
    $q->where(function ($q) {
       $q->where('GroupId', 'KO11')->orWhere('GroupId', 'KO05');
    });
})
$q->whereRaw("(GroupId = 'KO11' OR GroupId = 'KO05')")