【问题标题】:Laravel query Or operator priorityLaravel 查询或运算符优先级
【发布时间】: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 BYLIMIT 1 也没有意义,因为SQL 表/结果集是由SQL 标准定义的无序
  • 考虑到您在不使用查询构建器的情况下传递完全相同的查询,它应该返回相同的结果。
  • 接缝不见了-&gt;get() ?

标签: php mysql laravel laravel-4


【解决方案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();

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2014-12-02
    • 2011-07-07
    • 2011-06-21
    • 2013-02-24
    • 2012-08-10
    • 2020-03-05
    相关资源
    最近更新 更多