使用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.*']); |
|
|
|
|
|