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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

1回答

891閲覧

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

takigawa777

総合スコア21

Laravel 6

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

0クリップ

投稿2022/10/09 12:29

編集2022/10/10 07:03

前提

laravelにてクエリビルダを用いてプロフィール画面の改善を行っています。

実現したいこと

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

発生している問題・エラーメッセージ

エラーメッセージなどはなく、過去の投稿した内容を丸ごと一件ずつ呼び出したいのですが、phpmyadminで設定しているpostsテーブルから user_id(投稿者の名前)だけやcomment(投稿者の書いたコメント内容)だけを呼び出す方法は分かるのですが、postsテーブル丸ごと呼び出す際の書き方が分かりません。
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-09/8b45b187-71fc-4a80-8e82-f34bb3f3cd82.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); $post = $recommended_posts = Post::recommend($user->id)->get(); return view('users.show',[ 'title' => 'プロフィール', 'user' => $user, 'posts' => $posts, '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> @foreach ($posts as $post) <p>User Name : {{ $post->name }}</p> <p>Comment : {{ $post->comment }}</p> @endforeach @endsection

試したこと

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

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

Windows10 Laravel6_v1 cloud9

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

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

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

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

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

guest

回答1

0

inRandomOrderを使った事ないのですが、マニュアルを見る限り

php

1$posts = DB::table('posts')->inRandomOrder()->limit(3)->get();

もしくは

php

1$posts = Post::inRandomOrder()->limit(3)->get();

でいけないですかね?

状況としてはランダムで取得する方法は分かっていてコメント(comment)だけを取得などは成功しているのですが、
各投稿を丸ごと取得(投稿者や日時コメント内容など全て)する書き方が分かっていない状況になります。

bladeでforeachで回せば取れませんか?

blade

1@foreach ($posts as $post) 2 <p>User Name : {{ $post->name }}</p> 3 <p>Comment : {{ $post->comment }}</p> 4 <p>Create At : {{ $post->create_at }}</p> 5@endforeach

投稿2022/10/10 03:36

編集2022/10/10 05:45
watage

総合スコア24

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

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

takigawa777

2022/10/10 05:26

回答ありがとうございます。それをブレードに書く感じですかね? 言葉足らずで誤解を生んでいたら申し訳ないのですが、状況としてはランダムで取得する方法は分かっていてコメント(comment)だけを取得などは成功しているのですが、各投稿を丸ごと取得(投稿者や日時コメント内容など全て)する書き方が分かっていない状況になります。
watage

2022/10/10 05:42

bladeでforeachで回せば取れませんか? @foreach ($posts as $post) <p>User Name : {{ $post->name }}</p> <p>Comment : {{ $post->comment }}</p> @endforeach
takigawa777

2022/10/10 07:05

すみません、show.bladeのコントローラー部分の更新で躓いているのですが、ブレード部分でその$postsを書いた場合のコントローラーの書き方はどうなるのでしょうか? 質問内容は今書いている状態に更新しています。
watage

2022/10/10 08:23

$user = User::find($id); $post = $recommended_posts = Post::recommend($user->id)->get(); ここですか? 回答に記載していますが、 $posts = Post::inRandomOrder()->limit(3)->get(); じゃだめですか?
takigawa777

2022/10/10 11:47

ありがとうございます。 最初に頂いた二通りで試したところ、一つ目はClass 'App\Http\Controllers\DB' not foundのエラーが出ました。 今修正中ですが、二つ目は下記のエラーが出ていて画面が表示されない状態です。 Missing required parameters for [Route: users.edit] [URI: users/{id}/edit]. (View: /home/ec2-user/environment/laravel_photo/resources/views/users/show.blade.php)
watage

2022/10/10 12:39

エラーメッセージをよく読みましょう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問