Laravel雄辩,当一排符合2条条件时,我该如何将行排除在查询之外



,所以我正在尝试创建一个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->...})会做的。

最新更新