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

Posted

技术标签:

【中文标题】laravel 4 - 如何限制(采取和跳过)雄辩的 ORM?【英文标题】:laravel 4 - how to Limit (Take and Skip) for Eloquent ORM? 【发布时间】:2013-08-14 18:55:52 【问题描述】:

TL;DR

你能否限制 Eloquent ORM 查询,例如使用 take()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 查询构建器,我可以获得属于 id 1 的 user 的所有 games,并使用 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】:
User::find(1)->games()->take(3)->skip(2)->get();

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

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

享受 Laravel!

【讨论】:

嘿,我如何计算在采取和跳过之前找到的行数?我目前看到的唯一方法是复制查询。欢呼

以上是关于laravel 4 - 如何限制(采取和跳过)雄辩的 ORM?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQl 分页 - 限制和跳过

为啥分页插件和跳过/限制在那个 mongodb 查询中不起作用?

Laravel 雄辩用 whereHas 或其他限制 withCount

雄辩的关系,模型的链接(Laravel 5.4)

Laravel 4.2 雄辩的动态查询

如何使用 TSQL 而不是 linq 获取和跳过记录 [重复]