質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

750閲覧

投稿一覧画面にフォローしたユーザーの投稿も表示をさせたい

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/04/03 08:14

編集2023/04/05 10:37

実現したいこと

投稿一覧画面で自分の投稿とフォローしたユーザーの投稿を表示させたい。

前提

PHP, Laravelでブログサイトを作っています。
フォロー機能を作成後、投稿一覧画面でフォローしたユーザーの投稿を表示させたいと思いコードを書いたのですが、フォローしていないユーザーの投稿が表示されてどこを間違えているのか分からないので教えていただけると幸いです。

該当のソースコード

show.blade.php

php

1@extends('layouts.logged_in') 2 3@section('title', $title) 4 5@section('content') 6 <h1>{{ $title }}</h1> 7 <ul class="recommend_users"> 8 <li> 9 <a href="{{ route('users.show', $recommended_user) }}">{{ optional($recommended_user)->name }}</a> 10 @if(Auth::user()->isFollowing($recommended_user)) 11 <form method="post" action="{{route('follows.destroy', $recommended_user)}}" class="follow"> 12 @csrf 13 @method('delete') 14 <input type="submit" value="フォロー解除"> 15 </form> 16 @else 17 <form method="post" action="{{route('follows.store')}}" class="follow"> 18 @csrf 19 <input type="hidden" name="follow_id" value="{{ $recommended_user->id }}"> 20 <input type="submit" value="フォロー"> 21 </form> 22 @endif 23 </li> 24 </ul> 25 @forelse($posts as $post) 26 <li> 27 {{ $post->user->name }}: 28 {!! nl2br($post->comment) !!}<br> 29 ({{ $post->created_at }}) 30 </li> 31 @empty 32 <p>投稿がありません。</p> 33 @endforelse 34@endsection

UserController.php

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\User; 7use App\Http\Requests\UserRequest; 8use App\Http\Requests\UserImageRequest; 9 10class UserController extends Controller 11{ 12 public function __construct() 13 { 14 $this->middleware('auth'); 15 } 16 17 public function show($id){ 18 $user = User::find($id); 19 $posts = $user->posts()->latest()->get(); 20 21 return view('users.show',[ 22 'title' => 'プロフィール', 23 'user' => $user, 24 'posts' => $posts, 25 'recommended_user' => User::recommend($user->id)->get()->first(), 26 ]); 27 } 28 29 public function edit() { 30 $user = \Auth::user(); 31 32 return view('users.edit', [ 33 'title' => 'プロフィール編集', 34 'user' => $user, 35 ]); 36 } 37 38 public function update(UserRequest $request) { 39 $user = \Auth::user(); 40 $user->update($request->only(['name', 'email', 'profile'])); 41 42 session()->flash('success', 'プロフィールを編集しました'); 43 return redirect()->route('users.show', $user); 44 45 } 46}

User.php

php

1<?php 2 3namespace App; 4 5use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7use Illuminate\Notifications\Notifiable; 8use App\Follow; 9 10class User extends Authenticatable 11{ 12 use Notifiable; 13 14 15 protected $fillable = [ 16 'name', 'email', 'password', 'profile', 17 ]; 18 19 protected $hidden = [ 20 'password', 'remember_token', 21 ]; 22 23 protected $casts = [ 24 'email_verified_at' => 'datetime', 25 ]; 26 27 //リレーションを設定 28 public function posts(){ 29 return $this->hasMany('App\Post'); 30 } 31 public function isEditable($post){ 32 return $this->isAdmin() || $this->id === $post->user->id; 33 } 34 35 public function isAdmin(){ 36 return $this->admin === 1; 37 } 38 39 public function scopeRecommend($query, $self_id){ 40 return $query->where('id', '!=', $self_id)->latest()->limit(3); 41 } 42 43 public function follows(){ 44 return $this->hasMany('App\Follow'); 45 } 46 47 public function follow_users(){ 48 return $this->belongsToMany('App\User', 'follows', 'user_id', 'follow_id'); 49 } 50 51 public function followers(){ 52 return $this->belongsToMany('App\User', 'follows', 'follow_id', 'user_id'); 53 } 54 55 public function isFollowing($user){ 56 $result = $this->follow_users->pluck('id')->contains($user->id); 57 return $result; 58 } 59}

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。イメージ説明
testuser1でログインし、testuser2をフォローしました。
投稿一覧にはtestuser1の投稿とtestuser3の投稿が表示されてしまいました。
testuser1とtestuser2の投稿を表示させたいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

testuser1でログインし、testuser2をフォローしました。
投稿一覧にはtestuser1の投稿とtestuser3の投稿が表示されてしまいました。

ということは、$follow_user_ids = $user->follow_users->pluck('id'); の値が、testuser3 の id を返しているということは推測できますよね?

となると、User::follow_users() のリレーションの実装が間違っているんじゃないですか?

投稿2023/04/03 10:48

編集2023/04/03 10:49
phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/04/05 08:16

回答ありがとうございます。 この質問を後回しにしてしまい申し訳ありませんでした。 > となると、User::follow_users() のリレーションの実装が間違っているんじゃないですか? リレーション自体は間違ってないと思うのですが。。。 一応追記しておきます。
phper.k

2023/04/05 08:19

dd() などで値を確認しましょう。 実際のデータは私は持っていません。 > リレーション自体は間違ってないと思うのですが。。。 「間違っていないと『思う』」ではなく、確認した結果を
退会済みユーザー

退会済みユーザー

2023/04/05 08:45 編集

dd(follow_user_ids);の結果です。 Illuminate\Support\Collection {#1273 ▼ #items: array:2 [▼ 0 => 1 1 => 6 ] } testuser1がtestuser3をフォローしてることになってました。 indexでの表示が間違っているのでしょうか。 無知ですみません。。。 > 「間違っていないと『思う』」ではなく、確認した結果を すみませんでした。リレーションは間違っていませんでした。
phper.k

2023/04/05 08:59

1 は ログインしている testuser1 6 は testuser3 という認識であってる?
退会済みユーザー

退会済みユーザー

2023/04/05 09:02

そうです。
phper.k

2023/04/05 09:06

testuser2 の id が含まれてないんだから、リレーションが間違っている可能性と、 「testuser1でログインし、testuser2をフォローしました。」が本当は testuser3 をフォローしていたという可能性のどちらかではないのかい? フォローの機能を作成済みで、その機能を使って「フォロー」したのであれば、フォロー機能にミスがある可能性もありますよね?
退会済みユーザー

退会済みユーザー

2023/04/05 10:33

すみません!記載するコードを間違えていました。 編集し直します。
phper.k

2023/04/05 10:58

唐突にコードを変えるという意味が読み取れません。 どういう経緯でなぜ、書き換えたの?
退会済みユーザー

退会済みユーザー

2023/04/05 12:51

本当にすみません。 今ブログサイトの作成中でして、フォロー機能は投稿一覧画面(以前記載していたindex.blade.php)ではなく、ユーザープロフィール(今回記載しているshow.blade.php)にありずっとindex.blade.phpとPostControllerを見ていました。なのでどこをいじっても解決にはつながらなかったというわけです。急にコードを書き換えてしまって本当に申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問