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
?