回答

收藏

使用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.*']);
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则