49030


・users_table  
・posts_table  
という２つのテーブルがあり、user has many postsの関係です。

usersは、id・name  
postsは、id・user_id・content・created_at  
のカラムを持っています。

そこで、２０１８年9月３日以降に投稿したユーザを取得したいと考えました。

[code]

        $user = User::with(['posts' => function($query){
            $query->where('created_at', '>', '2018-09-03');
        }])->get();
        dd($user);
    
[/code]

・User.php

[code]

    public function posts(){
        return $this->hasMany('App\Post', 'user_id', 'id');
    }
    
[/code]

・users_tableの中身  
[![画像の説明をここに入力](https://i.stack.imgur.com/TTUXD.png)](https://i.stack.imgur.com/TTUXD.png)

・posts_tableの中身  
[!['postsテーブル'](https://i.stack.imgur.com/c4NeJ.png)](https://i.stack.imgur.com/c4NeJ.png)  
9月3日以降に投稿したユーザはuser_idが１または、３のユーザですので  
dd($user)では、user1・user3が取得される予定ですが、三人とも取得されてしまいます。

リレーション先の情報を元に、絞り込むにはどうすれば良いでしょうか？  
よろしくお願い致します。

[追記]

[code]

        $user = User::whereHas('posts', function($query){
            $query->where('created_at', '>', '2018-09-03');
        });
    
[/code]

を利用することによって、解決しましたが、whereHasでできて、eager loadでできないのは何故  
なのでしょうか？  
よろしくお願いいたします。


CC BY-SA 4.0
2018-10-06T07:37:55.060
49018
2018-10-07T06:01:44.547
2018-10-06T09:01:37.763
28944
28944
question
laravel laravel-5
Laravelでリレーション先(hasMany)の情報を利用し絞り込み


`whereHas` はサブクエリを用いてリレーションを用いたSQLを発行します。追記にある通り、今回の目的ではこれを用いるが正解です。

一方、eager loadというのは先に取得したModelのコレクションに対して **あとからリレーションの取得**
を行います。ここで指定できるクエリはメインのクエリ(ここではユーザー)に影響を与えることはなく、その **リレーション(post)を絞り込む** だけです。

(日本語訳ドキュメントをもう一度読んでみてください
[Eloquent：リレーション#Eagerロード](https://readouble.com/laravel/5.6/ja/eloquent-
relationships.html#eager-loading))


CC BY-SA 4.0
2018-10-07T06:01:44.547
49030
2018-10-07T06:01:44.547
2376
49018
answer