フォローしたユーザーの投稿を取得します
以下にテーブル構造やモデルの設定を簡単に示しておきます
以前にもフォロー機能作成記事を書いているので詳しくはそっちで
https://qiita.com/mitsu-0720/items/0c2fcdd367e8a6c5999c
Schema::create('follow_users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('followed_user_id')->index();
$table->unsignedBigInteger('following_user_id')->index();
$table->foreign('followed_user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('following_user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
// フォロワー→フォロー
public function followUsers()
{
return $this->belongsToMany('App\User', 'follow_users', 'followed_user_id', 'following_user_id');
}
// フォロー→フォロワー
public function follows()
{
return $this->belongsToMany('App\User', 'follow_users', 'following_user_id', 'followed_user_id');
}
public function timeline() {
$posts = Post::query()->whereIn('user_id', Auth::user()->follows()->pluck('followed_user_id'))->latest()->get();
return view('posts.timeline')->with([
'posts' => $posts,
]);
}
$posts = Post::query()->whereIn('user_id', Auth::user()->follows()->pluck('followed_user_id'))->latest()->get();
について
日本語で解説してみると
Post::query() ポストモデルの中の
whereIn('user_id') user_idが
Auth::user()->follows()->pluck('followed_user_id') 自分がフォローしているユーザーの中でフォロワーが自分であるユーザーを取得して
latest()->get() 最新順に取得する
といった感じになります
whereInはまだ自分も理解が浅いのですが第二引数が配列となる場合はこっちを使わないと想定した結果を取得できないイメージ
今回みたいに条件指定が複雑な場合はwhereよりwhereInを使った方がいいと思います
実際このtimeline()関数もwhereだと何も取得できませんでした
pluckメソッドは引数の値だけを取得できるメソッド
今回はフォローしてるユーザーのIDだけを取得したかったのでpluck('followed_user_id')でIDのみを取得しています
つまり今回自分がuser_id1、2、3のユーザーをフォローしているとすると上の関数は
Post::query()->whereIn('user_id', [1,2,3])->latest()->get();
といった意味を持ちます
##ハマった点
以前自分が書いたメソッドはこう
$posts = Post::query()->whereIn('user_id', Auth::user()->follows()->pluck('following_user_id'))->latest()->get();
フォローしてるユーザーのIDが欲しいんだから取得するのはfollowed_user_idではなくfollowing_user_idや!
と思ってdd($posts)してみたところ取得されたのは自分自身の投稿のみだった
当時は、は?????????????なんで??????????????????
ってなってましたが今考えればそれもそのはず
フォローユーザーは自分なのだからフォローしているユーザーのidを取得しても自分のIDしか取得できないのだ
##まとめ
フォローしているユーザーの投稿を取得したいのだからフォロワーのIDなんか使わないだろうと頭でっかちになって考えていたが
「フォロワーが自分であるユーザー」を取得することにより結果的に「自分がフォローしているユーザー」を取得できるという結論になったのはいい経験になった
プログラミングの面白さをしれたいい経験でした
##おまけ
「フォローしているユーザー」+「自分自身」の投稿を取得したい場合
$posts = Post::query()->whereIn('user_id', Auth::user()->follows()->pluck('followed_user_id'))->orWhere('user_id', Auth::user()->id)->latest()->get();