mysql - laravel 4 - 如何限制(采取和跳过) Eloquent ORM?

标签 mysql laravel laravel-4 limit eloquent

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/

相关文章:

mysql - 选择表 A 中与表 B 中的一组项目相连接的行

php - Laravel/MySQL 数据库连接

php - laravel 中如何获取列表的第一个元素?

php - 为 Controller 设置变量 - Laravel 4

php - MySQL "INSERT INTO"-错误 : which quotation do I have to use?

mysql - 使用 laravel Eloquent 查询中的 Join 和 OrderBy

mysql - 如何检测where子句中哪个条件为假

php - 从外部 FTP 服务器读取 > 1GB GZipped CSV 文件

laravel - 使用 Redis 在 Laravel 中缓存

css - 在 Laravel 4 中为表单设置提交按钮样式