MYSQL 与 Laravel 的 Eloquent

Posted

技术标签:

【中文标题】MYSQL 与 Laravel 的 Eloquent【英文标题】:MYSQL vs Laravel's Eloquent 【发布时间】:2021-08-09 07:25:36 【问题描述】:

我正在尝试将 mysql 查询转换为 Laravel 的 Eloquent 格式,MYSQL 版本在 MySQL Workbench 上返回一个值,但 Eloquent 版本返回一个具有相同请求参数的空值。

这里是查询的 MYQSL 版本

 " select
      SUM(
         DATEDIFF(
          if( end_date > $end_date, $end_date, end_date ),
          if( start_date < $start_date, $start_date, start_date )
         ) * child_rate
        )
    from rates where start_date < $end_date and end_date > $start_date


  ";

这是 Laravel 的 Eloquent 版本

$rate_query = "
        SUM(
         DATEDIFF(
          if( end_date > $end_date, $end_date, end_date ),
          if( start_date < $start_date, $start_date, start_date )
         ) * child_rate
        )
       ";

$total_child_rate = DB::table('rates')
                            ->selectRaw(DB::raw($rate_query))
                            ->where('start_date', '<', $end_date)
                            ->where('end_date', '>', $start_date)
                            ->get();

我做错了什么?

Edited this question to show the answer below

编写原始查询的正确方法是将查询包装在single qoute 中。下面是@damask回答后问题的解决方法

$rate_query = '
        SUM(
         DATEDIFF(
          if( end_date > ?, ?, end_date ),
          if( start_date < ?, ?, start_date )
         ) * child_rate
        )
       ';
        $total_child_rate = DB::table('rates')
                            ->selectRaw(DB::raw($rate_query), [$end_date, $end_date, $start_date, $start_date])
                            ->where('start_date', '<', $end_date)
                            ->where('end_date', '>', $start_date)
                            ->get();

【问题讨论】:

【参考方案1】:

可能是因为您使用双引号设置$rate_query$end_date$start_date 被评估为php 变量?尝试使用单引号或 Nowdoc 吗?

【讨论】:

我认为 $end_date 和 $start_date 是 php 变量,这就是他使用它来比较 if 语句的原因。 是的@damask @Sandeep 你们是对的,我将$rate_query 更改为使用单引号并得到一个值,我将编辑问题以显示正确的查询【参考方案2】:

使用 Laravel Telescope 查看查询输出并将其与原始查询进行比较。

【讨论】:

以上是关于MYSQL 与 Laravel 的 Eloquent的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的 ORM “独立” DB::raw 失败

MYSQL 与 Laravel 的 Eloquent

通过 SSL 与 Laravel 的 MySQL 连接

Laravel - MySQL - 时间戳性能与布尔列?

Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?

Laravel使用groupBy与动态生成mysql表