Laravel 查询或运算符优先级
Posted
技术标签:
【中文标题】Laravel 查询或运算符优先级【英文标题】:Laravel query Or operator priority 【发布时间】:2019-11-12 02:47:51 【问题描述】:我正在使用 laravel 4 查询。我想通过 OR 条件获取数据。 Laravel 4 有什么优先级规则吗?
我的查询是:
SELECT *
FROM order_items
WHERE (status = 'Y' OR (status = 'N' AND amount > 100))
AND product_id = '15'
LIMIT 1;
我有 2 个订单项目,但我希望结果中的第一个项目将获得优先状态 = 'Y',如果它不存在,那么它满足 OR 的第二个条件。
这是我的 laravel 代码:
$sql_select = "SELECT *
FROM order_items
WHERE (status = 'Y' OR (status = 'N' AND amount > 100))
AND product_id = '15'
LIMIT 1";
$data = DB::select($sql_select);
echo "<pre>";
print_r($data);
die;
对于简单的 mysql 查询,它可以工作,但在 laravel 中它没有给出结果。
【问题讨论】:
你能分享你的 laravel 代码吗? 另外,没有ORDER BY
的LIMIT 1
也没有意义,因为SQL 表/结果集是由SQL 标准定义的无序
How to Create Multiple Where Clause Query Using Laravel Eloquent?的可能重复
考虑到您在不使用查询构建器的情况下传递完全相同的查询,它应该返回相同的结果。
接缝不见了->get()
?
【参考方案1】:
也许你应该试试这个方法
DB::table('order_items')
->where('status', 'Y')
->orWhere(function($query)
$query->where('status', 'N')
->where('amount', '>', '100');
)
->where('product_id', 15)
->first();
【讨论】:
不确定 laraval 是如何实现first()
的,所以我不确定这是否比使用 LIMIT 1
没有 ORDER BY
子句更好。但我认为这是像肮脏/懒惰的第一个数组元素选择一样实现的出于某种原因在数据库结果..
方法 first() 正在检索第一个匹配查询约束的模型【参考方案2】:
很好的解决方案 andreeab。
在我的例子中,SQL 查询是:
选择 ... WHERE c1 = 'xyz' AND (c2 = 100 OR c2 = 200);
我用 Eloquent 写的:
DB:table('tablename')
->where('c1', '=', 'xyz')
->where(function($query)
$query->where('c2', '=', 100)
->orWhere('c2', '=', 200);
)
->get();
【讨论】:
以上是关于Laravel 查询或运算符优先级的主要内容,如果未能解决你的问题,请参考以下文章