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

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回答

825閲覧

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/13 09:32

編集2022/10/13 13:15

前提

現在Laravelにて画像投稿サイトを作成しています。
その画像投稿サイトでログインした自分のプロフィール画面にて、画面下部(タイトルおすすめ投稿の部分)に自身が投稿した最新の投稿10件をクエリビルダで取得し、そこからコレクションを用いてランダムに3件表示させようとしています。

実現したいこと

モデルとコントローラーでのコレクションまではある程度入力したのですが、ビュー側での受け取り方(書き方)と今書いている部分まで合っているかを教えて欲しいです。

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

Undefined variable: collection(コレクションが未定義)

該当のソースコード

Post.php(投稿を取得したい為ここにクエリビルダを書いています)

<?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){ //該当のユーザーの投稿 // 最新の投稿を10個取得 return $query->where('user_id', '=', $self_id)->latest()->limit(10); } }

UserController.php(取得した投稿はユーザープロフィール画面に表示させる為ここにコントローラーを書いています)

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Collection; 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(); $random = $recommended_posts->random(3); return view('users.show',[ 'title' => 'プロフィール', 'user' => $user, 'recommended_posts' => $recommended_posts 'random' => $random ]); } 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 class="posts"> @forelse($random as $post) <li class="post"> <div class="post_content"> <div class="post_body"> <div class="post_body_heading"> 投稿者:{{ $post->user->name }} ({{ $post->created_at }}) </div> <div class="post_body_main"> <div class="post_body_main_img"> @if($post->image !== '') <img src="{{ asset('storage/' . $post->image) }}"> @else <img src="{{ asset('images/no_image.png') }}"> @endif <a href="{{ route('posts.edit_image', $post) }}">画像を変更</a> </div> <div class="post_body_main_comment"> {{ $post->comment }} </div> </div> <div class="post_body_footer"> [<a href="{{ route('posts.edit', $post) }}">編集</a>] <form class="delete" method="post" action="{{ route('posts.destroy', $post) }}"> @csrf @method('DELETE') <input type="submit" value="削除"> </form> </div> </div> <div class="post_comments"> <span class="post_comments_header">コメント</span> <ul class="post_comments_body"> @forelse($post->comments as $comment) <li>{{ $comment->user->name }}: {{ $comment->body }}</li> @empty <li>コメントはありません。</li> @endforelse </ul> <form method="post" action="{{ route('comments.store') }}"> @csrf <input type="hidden" name="post_id" value="{{ $post->id }}"> <label> <input type="text" name="body"> </label> <input type="submit" value="送信"> </form> </div> </div> </li> @empty <li>書き込みはありません。</li> @endforelse </ul> @endsection

試したこと

コレクションサイトなどでランダムで表示方法の検索等

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

Windows10 Laravel6_v1

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下、明らかにいきなり変数が表れています

PHP

1 public function show($id) 2 { 3 $user = User::find($id); 4 $recommended_posts = Post::recommend($user->id)->get(); 5 $random = $collection->random(3); //ここの$collection

$recommended_postsでは?

投稿2022/10/13 11:38

m.ts10806

総合スコア80850

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

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

takigawa777

2022/10/13 12:38

エラーは消えましたが「ランダムに3件表示する」部分が作用せず「最新の投稿10件」のみ作用して過去に書き込んだものが最新のものから表示されている状態です。
m.ts10806

2022/10/13 12:41

どのように直したか分からないですが、そのランダムにされたはずのコレクションである$randomを返してないからでは。
takigawa777

2022/10/13 13:16

すみません、質問内容を変更し不足していたrandomを定義したところ無事解決しました。 回答頂きありがとうございます。
m.ts10806

2022/10/14 00:13 編集

解決されたようで何よりです。 コードは1行1行意味があるので、意味をおさえながら実装すると今回のようなケアレスミスは避けられると思います。 あと、全く的外れな修正依頼が届いてますが古くも何もなく、理由求めたところで修正依頼の意図の具体的な説明もないので、嫌がらせ行為として無視していいです。(誰の行為か調べるまでもなく明らかなので)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問