Laravel 4 - 如何对Eloquent ORM进行限制(Take和Skip)?

17

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 查询构建器,我可以获取所有属于ID为1的usergames,并使用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

1个回答

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

我认为这应该会得到你的集合。 :)

->games将会给你一个集合,而->games()则提供了一个查询构建器实例。

享受Laravel吧!


嘿,我该如何在进行取和跳过操作之前计算找到的行数?目前我唯一能想到的方法是复制查询。谢谢。 - Gga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接