【问题标题】:Query does not work in PHP but works in MySQL directly查询在 PHP 中不起作用,但在 MySQL 中直接起作用
【发布时间】:2016-03-01 04:57:37
【问题描述】:

当我尝试这个 Eloquent 查询时,我得到 0 作为我期待 217 的结果:

OrderItem::whereBetween(
        'created_at',
        [
            DB::raw("CONVERT_TZ('$start_date 09:00:00', '+00:00', '-06:00')"),
            DB::raw("CONVERT_TZ('$end_date 18:00:00', '+00:00', '-06:00')")
        ]
    )->count();

如果我在上面执行DB::getQueryLog(),复制编译后的查询以使用 MySQL Workbench 在数据库上执行它,然后我得到预期的结果 217。

select count(*) as aggregate 
from `order_items`
where
`created_at` between
CONVERT_TZ('2016-02-17 09:00:00', '+00:00', '-06:00') and
CONVERT_TZ('2016-02-29 18:00:00', '+00:00', '-06:00')

这是该查询日志的 var 转储:

array (3) [
    'query' => string (82) "select count(*) as aggregate from `order_items` where `created_at` between ? and ?"
    'bindings' => array (2) [
        Illuminate\Database\Query\Expression (1) (
            protected value -> string (53) "CONVERT_TZ('2016-02-17 09:00:00', '+00:00', '-06:00')"
        )
        Illuminate\Database\Query\Expression (1) (
            protected value -> string (53) "CONVERT_TZ('2016-02-29 18:00:00', '+00:00', '-06:00')"
        )
    ]
    'time' => float 0.41
]

什么可能阻止 Eloquent 实现正常工作?

【问题讨论】:

  • 一个想法...您在 Eloquent 查询中使用了两次 $date,在原始 SQL 中使用了两个不同的日期,所以两者并不相同。
  • $date 两次是我原始代码的复制错误。我已经更新以反映这一点。原本应该是同一日期不同时间,但我在创建这篇文章的中途更改了它以允许不同的日期。
  • 奇怪的是,只要时间跨度不同,即使使用相同的日期,这也应该有效,但无论它有哪个日期,无论这些日期之间有多少记录,都有在 PHP 中执行时总是返回零结果。

标签: php mysql laravel laravel-4


【解决方案1】:

在您的查询中

OrderItem::whereBetween(
        'created_at',
        [
            DB::raw("CONVERT_TZ('$date 09:00:00', '+00:00', '-06:00')"),
            DB::raw("CONVERT_TZ('$date 18:00:00', '+00:00', '-06:00')")
        ]
    )->count();

我看到你两次使用 $date。所以 Laravel 生成的 SQL 命令如下:

select count(*) as aggregate from `order_items` where between CONVERT_TZ('2016-02-10 09:00:00', '+00:00', '-06:00') and CONVERT_TZ('2016-02-10 18:00:00', '+00:00', '-06:00'); 

您将在查询中得到相同的日期,这与您在复制 sql 命令时提到的日期不同。

我没有看到这里有什么不工作

【讨论】:

  • $date 两次是我原始代码的复制错误。我已经更新了原始帖子以反映这一点。它原本应该是同一日期,但我在创建这篇文章的中途更改了它以允许不同的日期。
【解决方案2】:

试试这个

whereRaw("`created_at` between
CONVERT_TZ('2016-02-17 09:00:00', '+00:00', '-06:00') and
CONVERT_TZ('2016-02-29 18:00:00', '+00:00', '-06:00')")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 2021-01-07
    • 2012-04-08
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多