nie*_*ano 6 php mysql sql laravel eloquent
运行 Eloquent 连接查询时,我得到了一些意想不到的结果。我使用完全相同的查询得到两个不同的结果。第一个使用 DB::raw() 运行,第二个使用 Eloquent。
在 Eloquent 查询中,匹配的用户
where squad_user.leave_time >= seasons.start_time
丢失并且不会包含在结果集中。匹配的用户
or squad_user.leave is null
但是,将被包括在内。
这是两个查询结果的唯一区别。原始查询实际上会生成所需的结果集。
什么真正困扰我的是,如果我检查查询日志,既Laravel的和MySQL,我同时运行原料和雄辩的查询时,得到完全相同的查询。
原始查询(运行 Eloquent 查询时从查询日志中获得的实际查询)
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.end_time
and (squad_user.leave_time >= seasons.start_time or squad_user.leave_time is null)
and seasons.id = :seasonId
'),
['seasonId' => 3]
);
Run Code Online (Sandbox Code Playgroud)
雄辩的查询
return User::join('squad_user', 'users.id', '=', 'squad_user.user_id')
->join('seasons', 'squad_user.squad_id', '=', 'seasons.squad_id')
->where('squad_user.join_time', '<=', 'seasons.end_time')
->where(function ($query)
{
$query->where('squad_user.leave_time', '>=', 'seasons.start_time')
->orWhereNull('squad_user.leave_time');
})
->where('seasons.id', 3)
->get(['users.*']);
Run Code Online (Sandbox Code Playgroud)
Laravel 的 Eloquent 查询日志
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.end_time
and (`squad_user`.`leave_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"}
Run Code Online (Sandbox Code Playgroud)
MySQL 在 Eloquent 查询上的 general_log
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` <= ?
and (`squad_user`.`leave_time` >= ? or `squad_user`.`leave_time` is null)
and `seasons`.`id` = ?
Run Code Online (Sandbox Code Playgroud)
MySQL 在 Raw 查询上的 general_log
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.end_time
and (squad_user.leave_time >= seasons.start_time or squad_user.leave_time is null)
and seasons.id = ?
Run Code Online (Sandbox Code Playgroud)
我很感激这里的任何指示,因为我很迷茫。
where绑定第三个参数并通常将其视为字符串,除非您使用原始语句告诉它不要这样做。DB::raw或whereRaw将为您工作:
return User::join('squad_user', 'users.id', '=', 'squad_user.user_id')
->join('seasons', 'squad_user.squad_id', '=', 'seasons.squad_id')
->where('squad_user.join_time', '<=', DB::raw('seasons.end_time'))
->where(function ($query)
{
$query->where('squad_user.leave_time', '>=', DB::raw('seasons.start_time'))
->orWhereNull('squad_user.leave_time');
})
->where('seasons.id', 3)
->get(['users.*']);
Run Code Online (Sandbox Code Playgroud)