【问题标题】:How to transform sql query into Query Builder Laravel way?如何将 sql 查询转换为 Query Builder Laravel 方式?
【发布时间】:2021-02-04 08:27:23
【问题描述】:

我需要将此查询转换为 Laravel 查询构建器或 ORM

SET @start_date = '2020-11-01';
SET @end_date = '2020-11-08';
SET @duration = CONVERT(@end_date, DATE) - CONVERT(@start_date, DATE);

SELECT item_id, days
FROM (
SELECT item_id, sum(end_date - start_date) AS days 
FROM schedule WHERE start_date >= @start_date AND end_date <= @end_date 
GROUP BY item_id) AS virtual
WHERE days = @duration;

(我使用 Laravel 8)

我找不到类似的例子,我可以自己分析和尝试:(

我试试这个:

$res = DB::table('schedule')
    ->select('schedule.item_id' , DB::raw("SUM(schedule.end_date - schedule.start_date) as days"))
    ->where('start_date', '>=', $start_date)
    ->where('end_date', '<=', $end_date)
    ->groupBy('item_id')
    ->where('days', '=', $duration)
    ->get(); 

但我得到错误:

Column not found: 1054 Unknown column 'days' in 'where clause' 

【问题讨论】:

  • 如果您将where 更改为having,它可能会起作用。 WHERE 适用于每一列,因此聚合值(例如 SUM)此时将不可用。 having 改为在每个组上工作

标签: php sql laravel


【解决方案1】:

好的,我知道出了什么问题
我尝试在使用 AS 创建之前访问“天”列 该列将在 line ->get() 执行后可用。 所以我改变了这两行的顺序:

->where('days', '=', $duration)
->get(); 

 ->get() 
 ->where('days', '=', $duration);

现在可以工作了:)

【讨论】:

  • -&gt;get() 之后使用-&gt;where() 表示您正在使用Illuminate\Collection-&gt;where() 方法。它可能不是最高效的方法,具体取决于返回查询的大小。您可以在查询中使用-&gt;having('days', '=', $duration)-&gt;get() 访问days
  • 谢谢你的评论,我改成你描述的方式,结果是一样的,我认为它更合适。
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
相关资源
最近更新 更多