Laravelにてクエリビルダ・スコープを使ったおすすめ投稿の表示について
Q&A
Closed
解決したいこと
ユーザープロフィールページ(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