TL;DR

你能限制一个有说服力的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');
    }
}

Limit in Query Builder

使用常规的Laravel Query Builder,我可以得到属于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();

By listening to the illuminate.query event I can see that the query generated by this is:

select * from `games`
inner join `userGames`
on `userGames`.`game_id` = `games`.`id`
where `userGames`.`user_id` = ?
limit 3 offset 2

Limit in Eloquent ORM

当我试图用Eloquent 的语言重现同样的问题时:

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

I'm able to use take but adding skip causes an error. Also the resulting query does not actually contain the limit:

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

So it seems that the entire result is being queried first, which is not ideal when dealing with large data sets.


Question:

是否可以限制一个有说服力的ORM查询,以便在MYSQL查询级别也限制结果,相当于limit 3 offset 2

推荐答案

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

I think this should give you your collection. :)

->games将提供一个集合,->games()将提供一个查询生成器实例.

享受拉威尔!

Laravel相关问答推荐

Laravel Horizo​​n 限制与优化

Laravel 获取具有多对多关系的中间表数据

如何获取多态多对多关系子查询的自动 id 列名?

如何仅将日期列解析为月和日?

Laravel belongsTo 关系 - 试图获取非对象的属性

Laravel 5 - 手动分页

Laravel 5 make:控制器在应用程序文件夹而不是控制器文件夹中创建控制器

Heroku 上的 Laravel 队列工作者

Laravel timestamps() 不会创建 CURRENT_TIMESTAMP

条带 api 判断现有卡

Database[] 未配置 Laravel 5

Http请求多浏览器的烦恼

如何在 laravel 中解码 Json 对象并在 laravel 中应用 foreach 循环

测试指向外部站点的重定向链接

Laravel Eloquent - 加入表时防止覆盖值

是否可以将路由参数传递给 Laravel 中的控制器构造函数?

无法捕获 Carbon 抛出的异常

Class类 App\Http\Controllers\Auth\Request 不存在.

将值插入隐藏输入 Laravel Blade

Laravel s3 多桶