回答

收藏

使用DB :: raw和Eloquent使用同一查询的不同结果

技术问答 技术问答 104 人阅读 | 0 人回复 | 2023-09-12

运行Eloquent当我联系查询时,我得到了一些意想不到的结果。通过使用相同的查询,我得到了两个不同的结果。一个使用DB ::! {* s% I* U/ b* D- \/ J
raw()运行,第二次使用Eloquent。
" k2 Y7 f2 h# y& w/ M在口才查询中,和7 R" Y* e! a6 n  X5 T
where squad_user.leave_time >= seasons.start_time
4 h: J3 B' c/ w% w( D4 Q9 I# k结果集中不包括丢失。合格用户
" t  i1 ~) m" e$ I# bor squad_user.leave is null
1 k1 u. `( q% M, X但包括在内。. I5 T* o6 W, {; a/ r7 c4 G
这是两个查询结果的唯一区别。原始查询实际上会产生所需的结果集。
" e+ u: v/ [' W6 k什么     真正    困扰我的是,如果我检查查询日志,既Laravel的和MySQL,当我同时运行原材料和雄辩查询时,我得到了完全相同的查询。$ M% _6 m% Y  z1 L
原始查询    (操作口才查询时,我从查询日志中获得的 实际    查询)* ^2 o5 |4 T% j
return \DB::select(\DB::raw(              select users.*        from users        inner join squad_user on users.id = squad_user.user_id        inner join seasons on squad_user.squad_id = seasons.squad_id        where squad_user.join_time = seasons.start_time or squad_user.leave_time is null)        and seasons.id = :seasonId    seasonId' => 3]);口才查询
+ [0 v- l$ R5 D* B% r2 h$ W9 k& i3)3)                    ->get(['users.*']);3)           ->get(['users.*']);Laravel查询日志雄辩1 t% a* e5 Z; O: q/ x8 n) G
select `users`.*from `users`inner join `squad_user` on `users`.`id` = `squad_user`.`user_id`inner join `seasons` on `squad_user`.`squad_id` = `seasons`.`squad_id`where `squad_user`.`join_time` = seasons.start_time or `squad_user`.`leave_time` is null)and `seasons`.`id` = 3{"bindings":["seasons.end_time","seasons.start_time",3],"time":0.38,"name":"mysql"}MySQL的Eloquent查询的general_log# A$ x! ?, p: C- b
select `users`.*from `users`inner join `squad_user` on `users`.`id` = `squad_user`.`user_id`inner join `seasons` on `squad_user`.`squad_id` = `seasons`.`squad_id`where `squad_user`.`join_time` = ? or `squad_user`.`leave_time` is null)and `seasons`.`id` = ?MySQL在raw查询上的general_log
% W1 }( e1 D& }9 p: ~2 l, Mselect users.*            from users            inner join squad_user on users.id = squad_user.user_id            inner join seasons on squad_user.squad_id = seasons.squad_id            where squad_user.join_time = seasons.start_time or squad_user.leave_time is null)            and seasons.id = ?我很感激这里的任何指示,因为我很失落。
" ^/ W! K# a1 u( j# {' U0 X$ `5 C' @                                                               
0 E, ^$ e5 C  |7 U    解决方案:                                                               
0 g$ i2 r2 b& |  k3 D. h/ @! _                                                                where除非你使用它,否则绑定第三个参数并将其视为字符串raw句子告诉它不要这样做。DB::raw或whereRaw为您工作:- C  [) m/ o3 W
3)        ->get(['users.*']);                3)       ->get(['users.*']);
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则