Laravel 原始 sql 查询

Posted

技术标签:

【中文标题】Laravel 原始 sql 查询【英文标题】:Laravel raw sql query 【发布时间】:2021-07-03 09:39:35 【问题描述】:
select CONCAT(app_users.first_name) as display_name,COUNT(NewLeads.id)
from `app_users`
LEFT JOIN (SELECT app_leads.id, app_leads.owner_user_id from app_leads JOIN app_lead_version ON app_leads.id=app_lead_version.lead_id WHERE `app_leads`.`flag` = '1' and `app_leads`.`created_at` >= "2021-06-27 00:00:00" and `app_leads`.`created_at` <= "2021-06-28 23:59:59" ) as NewLeads ON NewLeads.owner_user_id=app_users.id
where `app_users`.`display_name` in ('Sam', 'Ash', 'Dan', 'Paul Thengilan', 'Scott')
group by `app_users`.`display_name`
order by `app_users`.`display_name` asc



$result = User::select(DB::raw('CONCAT(app_users.first_name) as display_name'),DB::raw('Count(app_leads.id) as new'))
            ->leftjoin('leads',function($join)use($time)
                $join->leftjoin('lead_version','lead_version.lead_id','=','leads.id');
                $join->on('leads.flag','=',DB::raw("'1'"));
                $join->on('leads.created_at','>=',DB::raw('"'.date("Y-m-d",strtotime($time)).' 00:00:00"'));
                $join->on('leads.created_at','<=',DB::raw('"'.date("Y-m-d",strtotime($time)).' 23:59:59"'));
                $join->on('leads.flag','=',DB::raw("'1'"));
                $join->on('leads.owner_user_id','=','users.id');

            )->whereIn('users.display_name',$user_display)->groupBy('users.display_name')->orderBy('users.display_name')->get()->toArray();

这是我的原始 sql 查询,我想将其转换为 laravel sql 查询下面是转换后的 laravel 查询,但是当我运行这两个查询时,我得到不同的结果,谁能帮我看看我的 laravel sql 查询出了什么问题

【问题讨论】:

【参考方案1】:

您可以调试这种情况的一种方法是删除

->get()->toArray()

来自$result 并记录/转储$result-&gt;toSql() 的值。

如果您可以将该输出添加到问题中,它可能会更容易为您提供帮助。

【讨论】:

选择 CONCAT(app_users.first_name) 作为 display_name,Count(app_leads.id) 作为新的来自 app_users left join app_leads on app_leads.flag = '1' 和 @987654328 @.created_at >= "2019-06-27 00:00:00" 和 app_leads.created_at app_leads.flag = '1' 和 app_leads.owner_user_id = app_users.id 其中app_users.display_name in (?, ?, ?, ?, ?) 和 app_users.deleted_at 是空组by app_users.display_name order by app_users.display_name asc 这是我使用 toSql() 方法时的查询。 我鼓励您使用 SQL 格式化程序(例如 dpriver.com/pp/sqlformat.htm)来比较两个查询并查看差异。我相信你的错误是在第二个->leftJoin,它也应该使用闭包。

以上是关于Laravel 原始 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL

原始 SQL 到 laravel 查询

将原始 SQL 转换为 Laravel 查询构建器

如何在 Laravel 6 中转换原始 sql 查询?

在 Laravel 5 Eloquent 中获取原始 SQL 查询的结果

Laravel 原始 SQL 查询,具有多次出现的命名绑定