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

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

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

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

Q&A

解決済

2回答

2518閲覧

laravel ログインユーザーごとの一覧表示機能ができない

kazuma-shino

総合スコア1

Laravel

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

0グッド

0クリップ

投稿2020/10/07 15:37

編集2020/10/07 16:13

前提・実現したいこと

Laravel6でログイン者が投稿したモノを一覧表示させる機能を作りたいです。

<input type="hidden" name="user_id" value="{{Auth::user()->id}}">

これでログイン者のidを送り、

public function getClothShow() { $id=Auth::user()->id; // Clothモデルのデータを取得 $clothes=Cloth::where("user_id",$id); return view('index.cloth',['clothes'=>$clothes]); }

コントローラーの部分で以上のようにしています。

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

エラーメッセージなどはなく、データが何も表示されません。
何が足りてないのでしょうか?

該当のソースコード

home.blade.php

1<input type="hidden" name="user_id" value="{{Auth::user()->id}}">

これでログイン者のidを送り、

Controller.php

1public function getClothShow() 2 { 3 $id=Auth::user()->id; 4 // Clothモデルのデータを取得 5 $clothes=Cloth::where("user_id",$id); 6 7 return view('index.cloth',['clothes'=>$clothes]); 8 }

コントローラーの部分で以上のようにしています。

一覧表示に用いるviewの該当ソースは以下の通りです

<div class="container"> <table class="table"> <tbody> @foreach($clothes as $cloth) <tr> <th scope="row">{{$cloth->image}}</th> <td>{{$cloth->category}}</td> <td>{{$cloth->name}}</td> <td>{{$cloth->category}}</td> <td>{{$cloth->size}}</td> <td> <a href="/cloth/{{$cloth->id}}" class="btn btn-primary btn-sm">詳細</a> <a href="" class="btn btn-primary btn-sm">編集</a> <a href="" class="btn btn-danger btn-sm">削除</a> </td> </tr> @endforeach </tbody> </table> </div>

試したこと

phpmyadminを確認すると、データは登録されており、user_idも登録されています。
dd()で$idの中身を確認すると1と表示されます。(user_idが1なのであっているはず)

$clothes=Cloth::all();

に変えるとデータはしっかりと表示されます。

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

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

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

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

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

firegrape

2020/10/07 16:04

viewのソースを書いていただけると。
kazuma-shino

2020/10/07 16:12

追記しました。いかがでしょうか?
m.ts10806

2020/10/07 21:37

同じ内容が繰り返されています。まとめてください。 ただ、「これでログイン者のidを送り」とありますが、受け取ってるわけではないようですね。Authから取り直すのであればhidden意味ないのでは? 「送り」と言いますが、どのように送っていますか? hiddenを含むコード、ルーティングも含めて全体の流れがわかる内容をご提示ください。
kazuma-shino

2020/10/08 01:12

情報不足失礼しました。hiddenで送ったデータは別のコントローラーによってデータに登録される仕組みは完成しておりました。お忙しい中ご検討くださいましてありがとうございます。 他の回答者の方のご指摘により、$clothes=Cloth::where("user_id",$id)のあとに->get();が抜けているだけだということが発覚しました。
m.ts10806

2020/10/08 01:16

実装とやりたいことが違うのは私も感じていました。 ただ、書かれていることが全てなのでなにがどこまで出来ているかはコードレベルでも分かるようにしてもらっていた方が良さそうです。 的確な回答がもらえるスピード感が全く違います
kazuma-shino

2020/10/08 05:27

ご指摘ありがとうございます。 初めての質問投稿ということもあり、どこまでコードを見せたほうがいいかわかりませんでした... 次回からは気をつけたいと思います。
m.ts10806

2020/10/08 05:31

基本的に「他者がコピペで再現確認できる程度」です。データ関係するのでしたら定義とサンプルデータまであればより良いです
kazuma-shino

2020/10/08 07:55

詳しく教えていただきありがとうございます。
guest

回答2

0

ベストアンサー

質問への回答だけならget()などが足りないだけだけど、やりたいことに対する実装方法が違う。

$clothes = Cloth::where("user_id", $id)->get();

「ログインユーザーに紐付いた何かの一覧」ならuser_idを送る必要はなく不要。

<input type="hidden" name="user_id" value="{{Auth::user()->id}}">

まずUserとClothでリレーションの関係を定義。たぶん1対多。
https://laravel.com/docs/6.x/eloquent-relationships
https://readouble.com/laravel/6.x/ja/eloquent-relationships.html

リレーションができていれば取得はこれだけでいい。最低限の「Laravelらしい使い方」はこれ。

php

1public function getClothShow() 2 { 3 // Clothモデルのデータを取得 4 $clothes = Auth::user()->clothes; 5 6 return view('index.cloth',['clothes'=>$clothes]); 7 }

もう一歩進めて自分ならこう書く。Requestはいつも使う&Userもいつも使う、ならRequestからUserを取得できれば便利という利便性から追加されている。use Auth;が不要。

php

1public function getClothShow(Request $request) 2{ 3 $clothes = $request->user()->clothes; 4 5 return view('index.cloth')->with(compact('clothes')); 6}

AuthやRequestやcompactはどっちでもよく好みで決めればいいレベルの話と
リレーションは絶対に使うべきレベルの話がある。
Laravelは結果は同じでも複数の書き方ができる。「普通はこう書く」が徐々に変わってるので古い情報を見てると書き方も古くなる。
$request->user()はLaravel5.0でも使えたのでこの辺りは5年前から何も変わってないけど。

投稿2020/10/07 23:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kazuma-shino

2020/10/08 01:18

ご回答ありがとうございます。 すべて試したところ、どの方法でも無事実装できることを確認しました。 リレーションは定義していたのですが、その上手な使い方がわからず、わざわざformでuser-idを送っていました。 せっかくなので、一番最後の方法で実装していきたいと思います。
guest

0

これ見て頂きたいのですが、

return view('index.cloth',['clothes'=>$clothes]);
こうではなく、
return view('test.normal',compact('clothes'));
こうではないでしょうか。

http://qiita.com/ryo2132/items/63ced19601b3fa30e6de

投稿2020/10/07 16:16

firegrape

総合スコア902

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

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

kazuma-shino

2020/10/07 16:28

回答ありがとうございます。 試してみたのですが、変化ありませんでした。
firegrape

2020/10/07 16:32

viewに渡す前には$clothesの中には値は入っている認識で大丈夫ですか?
kazuma-shino

2020/10/07 16:38

$clothes=Cloth::all();というふうに全件取得にすると$clothesに値がちゃんと渡されて表示できます。 しかし、$clothes=Cloth::where("user_id",$id);にすると$clothesに値が渡されておらず表示できていないだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問