replica410
@replica410 (陽 有村)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Laravelにてクエリビルダ・スコープを使ったおすすめ投稿の表示について

解決したいこと

ユーザープロフィールページ(show.blade)に飛んだ際に画面下部に、そのユーザーの投稿からランダムに3件だけおすすめの投稿として表示させたい。

発生している問題・エラー

エラーメッセージなどはなく、過去の投稿した内容を丸ごと一件ずつ呼び出したいのですが、phpmyadminで設定しているpostsテーブルから user_id(投稿者の名前)だけやcomment(投稿者の書いたコメント内容)だけを呼び出す方法は分かるのですが、postsテーブル丸ごと呼び出す際の書き方が分かりません。
![スクリーンショット (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535445/93cd0416-24c7-da9d-337b-e7cf3e91a7da.png)

![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535445/d4879c60-4c58-7b52-78de-d0ce01288c43.png)

該当するソースコード

Post.php(スコープを書いたPostモデル)
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments(){
        return $this->hasMany('App\Comment');
    }
    
    protected $fillable = ['user_id', 'comment', 'image'];
    
    public function user(){
        return $this->belongsTo('App\User');
    }
    
    // public function scopeRecommend($query){
    //     // ランダムに3つの投稿を取得
    //     // return $query->inRandomOrder()->limit(3);
    //     //最新の投稿を3つ取得
    //     return $query->latest()->limit(3);
    // }
    
    public function scopeRecommend($query, $self_id){
        //該当のユーザーの投稿
        // ランダムに3つの投稿を取得
        return $query->where('user_id', '=', $self_id)->inRandomOrder()->limit(3);
    }

}
UserController.php(ユーザープロフィール(show.blade)等のコントローラー)
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Post;
use App\Http\Requests\UserRequest;
use App\Http\Requests\UserImageRequest;

class UserController extends Controller
{
    public function show($id)
    {
        $user = User::find($id);
        $recommended_posts = Post::recommend($user->id)->get();
        return view('users.show',[
            'title' => 'プロフィール',
            'user' => $user,
            'recommended_posts' => $recommended_posts
        ]);
    }
    
    public function edit(int $id)
    {
        $user = User::find($id);
        return view('users.edit',[
            'title' => 'プロフィール編集',
            'user' => $user,
        ]); 
    }
    
    public function update(int $id, UserRequest $request){
        $user = User::find($id);
        $user->update($request->only(['name', 'email', 'profile']));
        session()->flash('success', 'プロフィールを編集しました!');
        return redirect()->route('users.show', $id);
    }
    
      // 画像変更処理
      public function editImage($id)
      {
        $user = User::find($id);
        return view('users.edit_image', [
          'title' => 'プロフィール画像変更画面',
          'user' => $user,
        ]);
      }
      public function updateImage($id, UserImageRequest $request){
          
          //画像投稿処理
          $path = '';
          $image = $request->file('image');
          
          if(isset($image) === true){
              // publicディスク(storage/app/)のphotosディレクトリに保存
              $path = $image->store('photos', 'public');
          }
          
          $user = User::find($id);
          
          // 変更前の画像の削除
          if($user->image !== ''){
              // publicディスクから、該当の投稿画像($user->image)を削除
              \Storage::disk('public')->delete(\Storage::url($user->image));
          }
          
          $user->update([
            'image' => $path, //ファイル名を保存    
          ]);
          
          session()->flash('success', '画像を変更しました!');
          return redirect()->route('users.show', $id);
      }
}
show.blade.php(ユーザープロフィール画面に当たるビュー)
@extends('layouts.logged_in')

@section('content')
<h1>{{ $title }}</h1>

<a href="{{ route('users.edit', Auth::user() )}}">編集</a>

    @if($user !== null)
    <div>
        名前
        {{ $user->name }}
    </div>
    <div>
  @if($user->image !== '')
      <img src="{{ asset('storage/' . $user->image) }}">
  @else
      <img src="{{ asset('images/no_image.png') }}">
  @endif
        <a href="{{ route('users.edit_image', $user) }}">画像を変更</a>
    </div>
    <div>
        <span>プロフィール</span>
        <ul>
            @if($user->profile)
            <li>{{ $user->profile }}</li>
            @else
            <li>プロフィールが設定されていません。</li>
            @endif
        </ul>
    </div>
    
    @else
<p>設定されていません。</p>

    @endif
    
<h2>{{ $user->name }} のおすすめ投稿</h2>
<ul>
    @forelse($recommended_posts as $recommend_post )
        <li><a href="{{ route('posts.show', $recommend_post) }}">{{ $recommend_post->comment }}</a></li>
        @empty
        <li>おすすめの投稿はありません。</li>
</ul>
    @endforelse
@endsection

自分で試したこと

show.blade下部に書いたクエリビルダ部分での投稿の呼び出し方の見直し

0

No Answers yet.

Your answer might help someone💌