使用DB :: raw和Eloquent使用同一查询的不同结果
技术问答
93 人阅读
|
0 人回复
|
2023-09-12
|
运行Eloquent当我联系查询时,我得到了一些意想不到的结果。通过使用相同的查询,我得到了两个不同的结果。一个使用DB ::
7 K% F( U- i( ^' U- `' `4 j7 D% fraw()运行,第二次使用Eloquent。
: l! O8 Q" B+ S; A' k( \- W u在口才查询中,和8 P! Z3 p! H0 _ [0 n& F2 O7 M R* v
where squad_user.leave_time >= seasons.start_time
4 K" j& M- _* W结果集中不包括丢失。合格用户% o1 S! F! p& L! D
or squad_user.leave is null1 I, y: [6 l" T: e! |
但包括在内。
3 W6 [1 [" f' S& b) x* W这是两个查询结果的唯一区别。原始查询实际上会产生所需的结果集。
3 Y4 ^' y6 U: Y什么 真正 困扰我的是,如果我检查查询日志,既Laravel的和MySQL,当我同时运行原材料和雄辩查询时,我得到了完全相同的查询。. W' K9 l2 ?9 ~7 A
原始查询 (操作口才查询时,我从查询日志中获得的 实际 查询)' w- X3 y. l A0 E
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]);口才查询
2 V! u- F: ?" S9 e |0 Y4 N7 n3)3) ->get(['users.*']);3) ->get(['users.*']);Laravel查询日志雄辩- C3 H. m( m J
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
% _- J* o7 e" nselect `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
+ Z0 c0 r) \6 m! z( yselect 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 = ?我很感激这里的任何指示,因为我很失落。
$ Y' y% ^. ?& I' | ( u; m8 G2 g/ w
解决方案:
" ?2 H \% _" ?. p* Y! _ where除非你使用它,否则绑定第三个参数并将其视为字符串raw句子告诉它不要这样做。DB::raw或whereRaw为您工作:
. J# f9 J' [0 x$ |3) ->get(['users.*']); 3) ->get(['users.*']); |
|
|
|
|
|