LARAVEL 5.4(但可能是一个更通用的SQL问题)
你好!我有一个结构表:
假设它是我的模型“ 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行
(应该是使用这些变量返回结果的同一查询)。
答案 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();