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

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

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

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

Q&A

解決済

2回答

1612閲覧

Laravel のフォームで、ユーザー情報を入力せずに登録したい

mikeko0901

総合スコア227

Laravel

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

0グッド

0クリップ

投稿2020/02/27 14:36

Laravelで、会員サイトを作っています。
ユーザーがマイページで自分の猫と、その猫に紐づく形で写真を登録できるようにしたいです。
登録した写真の一覧の表示(index)はできたのですが(登録はTinkerで行いました)、
ユーザーと猫に紐づく形での登録(store)に手間取っております…
ご教示いただけると助かります・・・

試したこと

表示(index)はできたので、同じように実装してみましたが、以下で躓いています。

写真を登録するページのURL:/users/1/photos/8
のように、ユーザーidが1、猫idが8です。

しかし、submitするとURLが /users/8/photos/1
になってしまい、そんなユーザーいないとエラーが出てしまいます。
以下、コードです。

View

{!! Form::open(['route' => ['user.photostore', $user->id, $cat->id], 'files' => true,'method' => 'post']) !!} {{ csrf_field() }} <div class="form-group"> {!! Form::label('image_path', 'Photo') !!} <input type="file" name="image_path"> </div> <div class="form-group"> {!! Form::label('comment', 'コメント') !!} {!! Form::textarea('comment', null, ['size' => '70x5']) !!} </div> {!! Form::submit('投稿', ['class' => 'btn btn-apply']) !!} {{ Form::close() }}

Route(web.php)

Route::group(['middleware' => 'auth:user'], function() { // 写真機能で追加 ユーザーの猫の写真一覧を表示 Route::group(['prefix' => 'users/{userid}'], function() { Route::get('photos/{catid}', 'PhotosController@userphotoindex')->name('user.photoindex'); Route::post('photos/{catid}', 'PhotosController@userphotostore')->name('user.photostore'); }); });

PhotosController

class PhotosController extends Controller { // ユーザーページで猫の写真一覧を取得する処理 public function userphotoindex($userid, $catid) { $data = []; if (\Auth::check()) { $cat = Cat::find($catid); $user = User::find($userid); $photos = $cat->photos()->where('user_id', $user->id)->orderBy('created_at', 'desc')->paginate(20); $data = [ 'cat' => $cat, 'user' => $user, 'photos' => $photos, ]; } //他のユーザーidを手入力してアクセスした時の処理。トップにリダイレクト if ($user->id == \Auth::user()->id) { return view('auth.usercatsphoto', $data); } else { $cats = Cat::where('status', '募集中')->paginate(20); return view('index', ['cats' => $cats,]); } } public function userphotostore(Request $request, $userid, $catid) { // 後でバリデーション入れる $photo = new Photo; // 画像をリサイズ //省略します $photo->image_path = $url; $photo->comment = $request->comment; $photo->cat_id = $catid; $photo->user_id = $userid;     $photo->save(); return back(); } }

Controllerのところで、dd($photo); で$photoの中身を見てみましたが、確かに、user_idが8に、cat_idが1というように反対になってしまってました。。
記述ミスがあると思うのですが、アドバイスいただけると助かります。


また、今回のように、フォームで自分のユーザーidや猫idを登録しなくても、写真とコメントを登録すれば、自動的にユーザーidと猫idが入るようにしたいといった場合、このようなやり方で合っておりますでしょうか。
もっとよいやり方があればご教示いただけると嬉しいです。

よろしくお願いいたします

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

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

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

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

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

guest

回答2

0

ログインユーザーに紐付いた、なら$useridは不要。
$request->user()でログインしてるユーザーなのでここから始めて繋げて行けば簡潔に書ける。(今はAuthを使うことはほぼない)
リレーション辺りはややこしいのでドキュメントをよく読んでもらうしかないけど。

public function userphotostore(Request $request, $catid) { { $request->user()->cats()->... }

このままだと他のユーザーが変更できそうなのでLaravelの「認可」機能使って
「このユーザーはこの猫を変更できる」か確認が必要。

投稿2020/02/28 01:04

kawax

総合スコア10377

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

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

mikeko0901

2020/02/28 14:44

ありがとうございます。$request->user()でユーザー情報を取得することができました!
guest

0

ベストアンサー

①について
collective使ってないので間違っているかもしれませんが

['user.photostore', 'userid' => $user->id, 'catid' => $cat->id]

の様な感じで明示的に指定してあげてはどうでしょうか(連想配列と配列が混ざっていてキモイですが)
または
routeではなくurlにして

['url' => route('user.photostore', ['userid' => $user->id, 'catid' => $cat->id])]

で、どうでしょうか


②について

useridをURLに必ず含めなくてもなんとかなるかと思います。
人対猫が
多対多なら今の方が良いかもしれませんが
1対多なら猫を指定すれば必ず人が指名できるのでuseridは不要かもしれません

投稿2020/02/27 15:31

mikkame

総合スコア5036

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

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

mikeko0901

2020/02/28 14:45

ありがとうございます!うまく登録することができました! どちらの方のアドバイスもとてもためになりました。 とても早くご回答いただきましたので、ベストアンサーにさせていただきます。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問