您是否可以限制使用take()
和skip()
的Eloquent ORM查询,以便生成的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');
}
}
使用常规Laravel 查询构建器,我可以获取属于{1}}的所有games
,并使用user
和{{来限制结果1}}:
take()
通过收听skip()
事件,我可以看到由此生成的查询是:
$test = DB::table('games')
->join('userGames', 'userGames.game_id', '=', 'games.id')
->where('userGames.user_id', '=', '1')->take(3)->skip(2)->get();
当我尝试使用Eloquent重新创建相同的查询时:
illuminate.query
我可以使用select * from `games`
inner join `userGames`
on `userGames`.`game_id` = `games`.`id`
where `userGames`.`user_id` = ?
limit 3 offset 2
,但添加$test = User::find(1)->games->take(2)->toArray();
会导致错误。此外,生成的查询实际上不包含限制:
take
所以似乎首先要查询整个结果,这在处理大型数据集时并不理想。
是否可以限制Eloquent ORM查询,以便在MYSQL查询级别限制结果,相当于skip
?
答案 0 :(得分:50)
User::find(1)->games()->take(3)->skip(2)->get();
我认为这应该会给你你的收藏。 :)
->games
将为您提供一个集合,其中->games()
将提供查询构建器实例。
享受Laravel!