TL;DR
你能像使用 take()
那样限制 Eloquent ORM 查询吗?和 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');
}
}
查询生成器中的限制
使用常规 Laravel 查询生成器我可以得到所有 games
属于user
id 为 1,并使用 take()
限制结果和 skip()
:
$test = DB::table('games')
->join('userGames', 'userGames.game_id', '=', 'games.id')
->where('userGames.user_id', '=', '1')->take(3)->skip(2)->get();
通过收听 illuminate.query
事件我可以看到由此生成的查询是:
select * from `games`
inner join `userGames`
on `userGames`.`game_id` = `games`.`id`
where `userGames`.`user_id` = ?
limit 3 offset 2
Eloquent ORM 中的限制
当我尝试用 Eloquent 重新创建相同的查询时:
$test = User::find(1)->games->take(2)->toArray();
我可以使用 take
但添加 skip
导致错误。此外,生成的查询实际上并不包含限制:
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` = ?
所以看起来是先查询整个结果,在处理大型数据集时并不理想。
问题:
是否可以限制 Eloquent ORM 查询,以便在 MYSQL 查询级别也限制结果,相当于 limit 3 offset 2
?
最佳答案
User::find(1)->games()->take(3)->skip(2)->get();
我认为这应该给你你的收藏。 :)
->games
将为您提供一个集合,其中 ->games()
将提供一个查询构建器实例。
享受 Laravel!
关于mysql - laravel 4 - 如何限制(采取和跳过) Eloquent ORM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18204342/