Pouvez-vous limiter une requête ORM Eloquent comme l'utilisation de take()
et skip()
afin que la requête mysql résultante soit également limitée, et qu'elle n'ait pas à renvoyer l'ensemble de données entier?
Si oui, comment modifieriez-vous:
$test = User::find(1)->games->toArray();
Pour inclure 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');
}
}
En utilisant le Laravel Query Builder je peux obtenir tous les games
qui appartiennent à user
d'id 1, et limiter le résultat avec take()
et skip()
:
$test = DB::table('games')
->join('userGames', 'userGames.game_id', '=', 'games.id')
->where('userGames.user_id', '=', '1')->take(3)->skip(2)->get();
En écoutant l'événement illuminate.query
, Je peux voir que la requête générée par ceci est:
select * from `games`
inner join `userGames`
on `userGames`.`game_id` = `games`.`id`
where `userGames`.`user_id` = ?
limit 3 offset 2
Lorsque j'essaie de recréer la même requête avec Eloquent:
$test = User::find(1)->games->take(2)->toArray();
Je peux utiliser take
mais l'ajout de skip
provoque une erreur. De plus, la requête résultante ne contient pas réellement la limite:
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` = ?
Il semble donc que le résultat entier soit interrogé en premier, ce qui n'est pas idéal lorsqu'il s'agit de grands ensembles de données.
Est-il possible de limiter une requête ORM Eloquent afin qu'au niveau de la requête MYSQL, elle limite également le résultat, équivalent à limit 3 offset 2
?
User::find(1)->games()->take(3)->skip(2)->get();
Je pense que cela devrait vous donner votre collection. :)
->games
Vous donnera une collection, où ->games()
offrira une instance de générateur de requête.
Profitez de Laravel!