Laravel / SQL:返回行,其中列等于NOT'something'和NULL

时间:2018-08-16 17:36:01

标签: sql laravel query-builder

LARAVEL 5.4(但可能是一个更通用的SQL问题)

你好!我有一个结构表:

enter image description here

假设它是我的模型“ Table”。

我想要一个查询:

使用(接收)变量:

$ id 数组['id','string',整数]

其中字符串是'<'或'>'

$ status_not_bad = bool;

(如果为true,则包括所有行,其中'status'!=='bad'AND'status'IS NULL);

例如,给我们:

$id = ['id', '>', 0];

$status_not_bad = true;

Table::thisquery() ... ->get();

“获取状态不错且id> 0的行”将返回第1行和第3行。

但如果我们给出:

$id = ['id', '<', 3];

$status_not_bad = true;

Table::thisquery() ... ->get();

“获取状态不差且id <3的行”返回第1行

(应该是使用这些变量返回结果的同一查询)。

2 个答案:

答案 0 :(得分:1)

只需链接您的->where()子句。也许还考虑将它们包装起来,以防止与任何其他冲突:

$results = Table::where("id", ">" 0)
->orWhere("number", ">", 2)
->orWhereNull("status")
->get();

或者,包裹起来:

$results = Table::where(function($query){
  $query->where("id", ">" 0)
  ->orWhere("number", ">", 2)
  ->orWhereNull("status");
})->get();

如果要查看实际执行的查询是什么,请将->get()替换为->toSql(),然后使用dd($result);

$results = Table::where(...)->toSql();
dd($results);

编辑:由于多种情况,听起来我们需要多个包装查询:

$results = Table::where(function($query){
  $query->where("status", "!=", "bad")
  ->where("id", "<", 3); -- "status is not bad and id < 3"
})->orWhere(function($query){
  $query->where("status", "!=", "bad")
  ->where("id", ">", 0); -- "status is not bad and id > 0"
})->get();

这应该处理您的注释中所述的配对条件。

答案 1 :(得分:0)

我以前从未使用过laravel,因此我的语法可能会关闭,但是我知道您想为此使用MySQL的ifNull函数:

Table::where([['id', '>', 0], ['number', '>', 2])->whereRaw("IfNull(status, 'blah') <> 'bad'")->get();