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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

3711閲覧

laravel 詳細画面の作成

hina0823

総合スコア15

Laravel

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/11/07 15:50

編集2020/11/08 09:52

前提・実現したいこと

laravelを使い詳細画面の作成をしています。
ユーザー名をクリックして、クリックしたユーザーのpostsテーブルの中身を取得したいのですが、うまくデータが受け渡されません。

該当ソースコード

index.blade.php (一覧表示)

php

1@foreach ($posts as $post) 2 <a href="{{ route('show', $post->id) }}" >{{ $post->username }}</a> 3@endforeach

show.blade.php (詳細画面)

php

1{{ $post->id }} 2{{ $post->post }} 3{{ $post->created_at }}

PostsController.php

php

1public function show($id) 2 { 3 $post = Post::find($id); 4 return view('users.show', compact('post')); 5 }

web.php

php

1Route::get('/show/{id}', 'PostsController@show')->name('show');

postsテーブル

php

1+------------+------------------+------+-----+---------+----------------+ 2| Field | Type | Null | Key | Default | Extra | 3+------------+------------------+------+-----+---------+----------------+ 4| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 5| user_id | int(10) unsigned | NO | MUL | NULL | | 6| post | varchar(500) | NO | | NULL | | 7| created_at | timestamp | YES | | NULL | | 8| updated_at | timestamp | YES | | NULL | | 9+------------+------------------+------+-----+---------+----------------+

補足

こちらの一覧表示画面ではユーザーのpostsテーブルの中身を取得できました。
フォローしているユーザーのみを表示の画面でpostsテーブルの中身を取得する時に値がnullになって返ってきます。
dd(); デバックで確かめたところ、postsテーブルのidではなくfollowsテーブルのidを取得していることが原因なのですが、下記リレーションの記述でpostsテーブルのidを取得する記述が分からずにいます。

該当ソースコード

index.blade.php (一覧表示)

php

1@foreach ($posts as $post) 2 <a href="{{ route('show', $post->id) }}" >{{ $post->username }}</a> 3@endforeach

FollowList.php

php

1@foreach ($posts as $post) 2 <a href="{{ route('profile', $post->id) }}" >{{ $post->username }}</a> 3@endforeach

FollowsController.php (フォローしているユーザーの一覧表示)

php

1public function followList() 2{ 3 $user = auth()->user(); 4 $posts = \DB::table('users') 5 ->join('posts', 'posts.user_id', '=', 'users.id') 6 ->join('follows', 'follows.followed_id', '=', 'posts.user_id') 7 ->where('follows.following_id', '=', $user->id) 8 ->get(); 9 return view('follows.followList',['posts' => $posts]); 10}

PostsController.php(クリックしたユーザーのデータを取得)

php

1public function profile($id) 2{ 3 $post = post::find($id); 4 return view('users.profile', ['post' => $post]); 5}

web.php

php

1Route::get('/profile/{id}', 'PostsController@profile')->name('profile');

followsテーブル

+--------------+------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+-------------------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | following_id | int(10) unsigned | NO | MUL | NULL | | | followed_id | int(10) unsigned | NO | MUL | NULL | | | created_at | timestamp | NO | | CURRENT_TIMESTAMP | | +--------------+------------------+------+-----+-------------------+----------------+

postsテーブル

+------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | user_id | int(10) unsigned | NO | MUL | NULL | | | post | varchar(500) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+------------------+------+-----+---------+----------------+

usersテーブル

+------------+------------------+------+-----+----------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+----------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(255) | NO | | NULL | | | mail | varchar(255) | NO | | NULL | | | password | varchar(255) | NO | | NULL | | | bio | varchar(400) | YES | | NULL | | | images | varchar(255) | YES | | dawn.png | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+------------------+------+-----+----------+----------------+

バージョン

laravel 5.5.48
php 7.4.5
homestead

長い質問になり申し訳ございません。ご教授の程、宜しくお願い致します。

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

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

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

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

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

m.ts10806

2020/11/07 20:31

findではなく愚直にwhereでカラムを指定した場合はどうでしょうか。
hina0823

2020/11/08 02:28

ご回答ありがとうございます。 ご指摘の通り行ったところ、postモデルを受け取ることができました。 Builder {#309 ▼ #query: Builder {#308 ▶} #model: Post {#313 ▼ #fillable: array:2 [▶] #connection: null #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: false +wasRecentlyCreated: false #attributes: [] #original: [] #changes: [] #casts: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: true #hidden: [] #visible: [] #guarded: array:1 [▶] } #eagerLoad: [] #localMacros: [] #onDelete: null #passthru: array:12 [▶] #scopes: [] #removedScopes: [] } モデルを呼び出せましたが、思っている値を取得出来ていないためモデルにテーブルを呼び出す指示を記述するということでお間違いないでしょうか?
m.ts10806

2020/11/08 05:01

質問本文に現状含めて追記してください。 >モデルにテーブルを呼び出す指示を 通常、モデルはテーブルと1対1で紐づくのでは。 「モデル」がそもそも何ものか理解して使っているのでしょうか。
hina0823

2020/11/08 09:54

申し訳ございません。現状を追記致しました。 Modelはデータベースとのやり取りを行う物という認識でしたが、再確認の為勉強しなおしたいと思います。
guest

回答2

0

diff

1public function profile($id) 2{ 3- $post = post::find($id); 4+ $post = Post::find($id); 5 return view('users.profile', ['post' => $post]); 6}

Post モデルが提示されてないので、検証のしようがありませんが、多分こうでしょう。

投稿2020/11/08 12:02

phper.k

総合スコア3923

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

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

hina0823

2020/11/08 12:22

ご回答ありがとうございます。 頂いた記述を試した結果、値はnullで返ってきております。 また、このようなミスが無いよう気を付けたいと思います。
phper.k

2020/11/08 12:56

引数の $id には、値が来ているのですか?
hina0823

2020/11/08 13:01

引数の $id には値入っています。 ですが、上記記述ですとfollowsテーブルのidを取得しており私が取得したいのはpostsテーブルのidになります。FollowsControllerのリレーションの記述が問題だということが推測できるのですが、そのリレーションの記述がうまくできずにいる状態です。
phper.k

2020/11/08 13:06

そりゃそうですよね… route('profile', $post->id) ここで post の id 渡してるんですから。
hina0823

2020/11/08 13:19

route('profile', $post->id) 現状こちらの記述で渡されているのは、followsテーブルのidになします。 実際に引数の $id をdd();で調べるとfollowsテーブルのidが渡されています。
phper.k

2020/11/08 13:47

うーん followsテーブルのid なのであれば、なぜ?$post->idこうしてるの? わざわざ間違いしやすいコード書いて、わからなくなるのでは本末転倒です。 書き直しましょう
hina0823

2020/11/08 13:51

申し訳ございません。 本来はpostsテーブルのidを取得したいのでそのように書いております。 やはりリレーションの部分が怪しいので、もう少し考えてみたいと思います。
hina0823

2020/11/08 14:18

ありがとうございます。 こちらの問題は解決しました。 ですが、これからも分からないことが出てくると思いますので頂いたファイルを参考に作成していきたいと思います。
guest

0

自己解決

FollowdControllerを下記のようにしたところ、postsテーブルのidを取得できました。

php

1public function followList() 2 { 3 $user = auth()->user(); 4 $posts = \DB::table('users') 5 ->join('follows', 'follows.followed_id', '=', 'users.id') 6 ->join('posts', 'posts.user_id', '=', 'follows.followed_id') 7 ->where('follows.following_id', '=', $user->id) 8 ->get(); 9 return view('follows.followList',['posts' => $posts]); 10 }

投稿2020/11/08 14:19

hina0823

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問