Подтвердить что ты не робот

Laravel 4 - как ограничить (принять и пропустить) для Eloquent ORM?

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 Query Builder, я могу получить все 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

Предел в ярко выраженной 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` = ?

Итак, кажется, что сначала запрашивается весь результат, который не идеален при работе с большими наборами данных.


Вопрос:

Возможно ли ограничить запрос ORICK ORK, чтобы на уровне запросов MYSQL он также ограничивал результат, эквивалентный limit 3 offset 2?

4b9b3361

Ответ 1

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

Я думаю, это должно дать вам вашу коллекцию.:)

->games предоставит вам коллекцию, где ->games() предложит экземпляр построителя запросов.

Наслаждайтесь Laravel!