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的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?