,所以我正在尝试创建一个laravel雄辩的查询。它有点复杂,并且有很多子句,都可以很好地工作,并且正在查询一个表。但是,我想添加一个特定条件,如下所述。
->where('date', '>', Carbon::now())
这种情况正常工作,但是我希望此条件仅适用于特定行!假设我希望上述条款适用于:
->where('row_type', '=', 'someType')
现在,我不想过滤所有行row_type ='wory stype'的所有行,也不想在所有行中> date> carbon :: now()。
我只想用date> carbon :: now()row_type ='fory stype'。
当然," date"one_answers" row_type"都是我的表中的列。
现在要简化逻辑,我想做的基本上是排除行(date< carbon :: now()()和row_type ='fory stype')是正确的。
这可以在雄辩中的单个查询中进行,而无需插入RAW SQL?
我能够在RAW SQL中重现我的查询:
select id, date, row_type from my_table where case when row_type = 'someType' then date > '2019-03-01%' end;
现在要简化逻辑,我想做的基本上是排除行(date< carbon :: now()()和row_type ='fory stype')是正确的。
应用正式的布尔逻辑!(A and B) = !A or !B
,或者只需注意"排除两个是真实的地方"等同于"如果任何一个是false"。因此,我们包括那些日期没有过去的行(即未来)或类型不是某个类型的行。
->where('row_type', '!=', 'someType')->orWhere('date', '>', Carbon::now())
如果您也有其他条件,并且包括orWhere
会拧紧这些条件,则应仅将其嵌套为此:
// ...other wheres...
->where(function($query) {
$query->where('date', '>', Carbon::now())->orWhere('row_type', '!=', 'someType');
})
->where( // ...other wheres...
我将尝试通过SQL来证明这有效。
CREATE TABLE my_table(Id integer PRIMARY KEY, row_type text, date date);
/* First row is someType and past - it should be excluded */
INSERT INTO my_table VALUES(1,'someType', '2019-03-01');
INSERT INTO my_table VALUES(2,'someType', '2019-03-31');
INSERT INTO my_table VALUES(3,'otherType', '2019-03-01');
INSERT INTO my_table VALUES(4,'otherType', '2019-03-01');
COMMIT;
OP中的查询是:
SELECT 'Cases from the OP' as '';
SELECT id, row_type, date
FROM my_table
WHERE
CASE
WHEN row_type = 'someType'
THEN date > '2019-03-22%'
END;
/* returns */
2|someType|2019-03-31
它甚至没有用文字来做您所陈述的事情。它还不包括Row_type并非某个时候的每个行。这相当于row_type = 'someType' AND date > '2019-03-22'
。为了使其排除您所说的内容应该被排除在外,您必须使其更加复杂:
SELECT id, row_type, date
FROM my_table
WHERE
CASE
WHEN row_type = 'someType'
THEN date > '2019-03-22'
ELSE 1
END;
/* returns */
2|someType|2019-03-31
3|otherType|2019-03-01
4|otherType|2019-03-01
在 SELECT ' ' as '';
SELECT 'The same using OR' as '';
SELECT id, row_type, date
FROM my_table
WHERE
(row_type != 'someType' OR date > '2019-03-22');
/* returns */
2|someType|2019-03-31
3|otherType|2019-03-01
4|otherType|2019-03-01
您说的是您也希望添加其他语句时,我将条件包裹在括号中。这就是where(function($q) {$q->...})
会做的。