web-dev-qa-db-fra.com

laravel 4 - comment limiter (prendre et sauter) pour Eloquent ORM?

TL; DR

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?


Les tables:

users       games           userGames
-- id       -- id           -- user_id
-- name     -- name         -- game_id
            -- Steam_id

Des modèles:

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');
    }
}

Limite dans le générateur de requêtes

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

Limite dans l'ORM éloquent

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.


Question:

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?

17
Johannes
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!

50
daylerees