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->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