TL;DR
你能限制一个有说服力的ORM查询,比如使用take()
和skip()
,这样得到的mysql查询也会受到限制,并且不必返回整个数据集吗?
如果是,您将如何修改:
$test = User::find(1)->games->toArray();
包括limit 3 offset 2
人?
桌子:
users games userGames
-- id -- id -- user_id
-- name -- name -- game_id
-- steam_id
模型:
class User extends Eloquent {
public function games() {
return $this->belongsToMany('Game', 'userGames', 'user_id', 'game_id');
}
}
class Game extends Eloquent {
public function users() {
return $this->belongsToMany('User', 'userGames', 'user_id', 'game_id');
}
}
Limit in Query Builder
使用常规的Laravel Query Builder,我可以得到属于id 1的user
的所有games
个,并将结果限制为take()
和skip()
:
$test = DB::table('games')
->join('userGames', 'userGames.game_id', '=', 'games.id')
->where('userGames.user_id', '=', '1')->take(3)->skip(2)->get();
By listening to the illuminate.query
event I can see that the query generated by this is:
select * from `games`
inner join `userGames`
on `userGames`.`game_id` = `games`.`id`
where `userGames`.`user_id` = ?
limit 3 offset 2
Limit in Eloquent ORM
当我试图用Eloquent 的语言重现同样的问题时:
$test = User::find(1)->games->take(2)->toArray();
I'm able to use take
but adding skip
causes an error. Also the resulting query does not actually contain the limit:
select `games`.*, `userGames`.`user_id` as `pivot_user_id`,
`userGames`.`game_id` as `pivot_game_id` from `games`
inner join `userGames`
on `games`.`id` = `userGames`.`game_id`
where `userGames`.`user_id` = ?
So it seems that the entire result is being queried first, which is not ideal when dealing with large data sets.
Question:
是否可以限制一个有说服力的ORM查询,以便在MYSQL查询级别也限制结果,相当于limit 3 offset 2
?