首页 > 解决方案 > 如何在查询生成器 laravel 中执行此 SQL?

问题描述

如何在查询生成器 laravel 中执行此 SQL?

SELECT date_trunc('day', created_at) AS hour_stump,
  (extract(hour FROM created_at)::int / 60) AS min_slot,
  count(*),
  max(e4) as kwh
FROM energydata_1001
WHERE api_key_value= 'YaB8JCcE'
AND date(created_at) >= '2020-11-30 23:59:59'
AND date(created_at) <= '2020-12-29 00:00:00'
GROUP  BY 1, 2
ORDER  BY 1, 2;

任何人都可以帮助我,因为我是 laravel 的新手。谢谢你。

标签: phplaravel

解决方案


这是逐行等效的。

SQL 建造者
SELECT
    date_trunc('day', created_at) AS hour_stump,
    (extract(hour FROM created_at)::int / 60) AS min_slot,
    count(*),
    max(e4) as kwh
FROM energydata_1001
WHERE api_key_value= 'YaB8JCcE'
AND date(created_at) >= '2020-11-30 23:59:59'
AND date(created_at) <= '2020-12-29 00:00:00'
GROUP BY 1, 2
ORDER BY 1, 2;
 
DB::query()
    ->selectRaw("date_trunc('day', created_at) AS hour_stump") /* day must be in single quotes because it's a raw expression. */
    ->selectRaw('(extract(hour FROM created_at)::int / 60) AS min_slot')
    ->selectRaw('count(*)')
    ->selectRaw('max(e4) as kwh')
    ->from('energydata_1001')
    ->where('api_key_value', '=', 'YaB8JCcE')
    ->whereRaw("date(created_at) >= ?", ['2020-11-30 23:59:59'])
    ->whereRaw("date(created_at) <= ?", ['2020-12-29 00:00:00'])
    ->groupByRaw('1, 2')
    ->orderByRaw('1, 2')
    ->get();
  • selectRaw必须使用,而不是select因为您的 select 语句具有函数和转换(date_trunc、extract、::int、count、max)。selectRaw支持原始 sql 表达式。
  • whereRaw由于功能相同date()
  • groupByRaw必须使用,因为您没有按选定的列分组。
  • orderByRaw必须使用,因为您不是按选定的列排序。

这可以写得有点不同。

  • 而不是DB::query()->selectRaw(...->from('energydata_1001'),你可以写DB::table('energydata_1001')->selectRaw(...。我选择这样写是为了便于比较。生成的 SQL 不会改变。
  • 而不是whereRaw("date(created_at) <= ?", ['2020-11-30 23:59:59'])你可以使用whereDate('created_at', '<=', '2020-11-30 23:59:59'). 不同之处在于生成的 SQL。在使用 PostgreSQL 时 whereDate将列转换为日期而不是使用该函数。date()
    • whereRaw("date(created_at) >= ?", ['2020-11-30 23:59:59'])
      转换为where/and date(created_at) >= '2020-11-30 23:59:59'
    • whereDate('created_at', '>=', '2020-11-30 23:59:59')
      where/and created_at::date >= '2020-11-30 23:59:59'在 PostgreSQL 中转换为。

推荐阅读