17

TL;DR

take()andを使用するように Eloquent ORM クエリを制限し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を使用すると、ID 1 にgames属するすべてのものを取得し、結果をandで制限できます。usertake()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

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

そのため、結果全体が最初にクエリされているように見えますが、これは大きなデータ セットを扱う場合には理想的ではありません。


質問:

Eloquent ORM クエリを制限して、MYSQL クエリ レベルでも結果を制限することは可能limit 3 offset 2ですか?

4

1 に答える 1