【问题标题】:How to convert a sql query to laravel queryBuilder如何将 sql 查询转换为 laravel queryBuilder
【发布时间】:2020-07-01 16:33:31
【问题描述】:

我有一个 sql 查询如下:

SELECT count(as_user_id) as Users,
 CONCAT( HOUR(created_at), ' to ', CONCAT( HOUR(created_at), ':59:59' ) ) as Time_Frame
FROM content_impression
WHERE created_at >= NOW() - INTERVAL 1 DAY
GROUP BY 
 DATE(created_at), 
 HOUR(created_at)
ORDER BY count(as_user_id) DESC

查询的结果是:

用户 | Time_Frame

  • 2 | 10点到10点59分59秒
  • 2 | 9点到9点59分59秒
  • 1 | 11点到11点59分59秒
  • 1 | 12点到12点59分59秒

我想转换成 eloquent 查询。

我也试过了,

$results = DB::table("content_impression")
        ->select(DB::raw(" count(as_user_id) as Users,CONCAT( HOUR(created_at), ' to ', CONCAT( HOUR(created_at), ':59:59' ) ) as Time_Frame"))
        ->whereRaw("created_at >= NOW() - INTERVAL 1 DAY")
        ->groupByRaw("DATE(created_at),HOUR(created_at)")->orderByRaw("count(as_user_id) DESC")->get();

出现如下错误;

【问题讨论】:

  • 在研究了多个 stackoverflow 问题和答案后,我想到了:$results = DB::table("as_journey_content_impression")->select(DB::raw("count(as_user_id) as Users", "CONCAT( HOUR(created_at), ' to ', CONCAT(HOUR(created_at), ':59:59') as Time_Frame"))->whereBetween('created_at',array(Carbon::now(), Carbon::now()->subDays(1))->groupBy([DB::raw('DATE(created_at)'),DB::raw('HOUR(created_at)')])->orderBy('Users','desc')->get();
  • 这里列出了有助于解决此问题的链接:whereBetweensubDaysCONCATSelect count and groupBy
  • 错误本身与querybuilder无关,与laravel/database配置有关。
  • See here 获取此错误消息。

标签: mysql laravel eloquent query-builder


【解决方案1】:

试试这样:

  1. 使用where('created_at','>=',now()->subDay(1)) 而不是whereRaw("created_at >= NOW() - INTERVAL 1 DAY")
  2. 使用groupBy('Time_Frame'),因为错误告诉您groupBy选择的列被命名为Time_frame not DATE(created_at),HOUR(created_at)
  3. 使用latest('Users') 代替orderByRaw("count(as_user_id) DESC") 并使用您在orderBy 中定义的别名(Users) 而不是count(as_user_id)
$results = DB::table("content_impression")
               ->selectRaw(" count(as_user_id) as Users,CONCAT( Hour(created_at), ' to ', CONCAT( Hour(created_at), ':59:59' ) ) as Time_Frame")
               ->where('created_at','>=',now()->subDay(1))
               ->groupBy('Time_Frame')->latest('Users')->get();

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2020-05-06
    相关资源
    最近更新 更多