laravel 4 - 如何限制(采取和跳过)雄辩的ORM?

时间:2013-08-13 08:37:29

标签: mysql laravel laravel-4 limit eloquent

TL; DR

您是否可以限制使用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 ORM的限制

当我尝试使用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

1 个答案:

答案 0 :(得分:50)

User::find(1)->games()->take(3)->skip(2)->get();

我认为这应该会给你你的收藏。 :)

->games将为您提供一个集合,其中->games()将提供查询构建器实例。

享受Laravel!