Laravel Eloquent如何优雅实现多维度数组WhereNot的OR条件查询
优雅实现多组OR条件的NOT查询需求
我需要检索所有不满足指定多组(from, to)匹配条件的数据行,预期生成的SQL如下:
SELECT * FROM range WHERE NOT ( (from = 1000 AND to = 2000) OR (from = 2000 AND to = 3000) );
我尝试用Laravel查询构造器写了如下代码:
$array = [ [ 'from' => 1000, 'to' => 2000, ], [ 'from' => 2000, 'to' => 3000 ] ]; $this->whereNot(function ($query) use ($array) { foreach($array as $item) { $query->where($item); } });
但生成的SQL不符合预期,两组条件被错误地用AND连接:
SELECT * FROM range WHERE NOT ( (from = 1000 AND to = 2000) AND (from = 2000 AND to = 3000) );
我目前的临时解决方案是通过判断迭代索引来区分where和orWhere:
$this->whereNot(function ($query) use ($array) { foreach($array as $i => $item) { if($i == 0) { $query->where($item); } else { $query->orWhere($item); } } });
这个方案可以正常工作,但我想了解是否存在无需判断迭代索引的更优雅实现方式。
内容的提问来源于stack exchange,提问作者Remy
相关产品推荐
相关产品推荐

