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

TL; DR

你可以限制一个口述的ORM查询,就像使用take()和skip()一样,使得生成的mysql查询也受到限制,并且不必返回整个数据集?

如果是这样,你如何修改:

$test = User::find(1)->games->toArray();

包括极限3偏移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 Query Builder,我可以获得属于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

雄辩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` = ?

所以看来,整个结果是先被查询,这在处理大数据集时并不理想。

题:

是否有可能限制雄辩的ORM查询,以便在MYSQL查询级别也会限制结果,相当于限制3的偏移2?

最佳答案
User::find(1)->games()->take(3)->skip(2)->get();

我认为这应该给你你的收藏。 🙂

– >游戏会给你一个集合,其中 – > games()将提供一个查询构建器实例。

享受Laravel!

转载注明原文:mysql – laravel 4 – 如何限制(采取和跳过)雄辩的ORM? - 代码日志