Laravel ユーザー毎に記録を作成、表示できるように

こんにちは!Laravel勉強中のhirokinishizawaです!

このlaravel勉強ブログでは、はじめてversion minorをしてみたので前回から見て頂けると幸いです!(一気に.5上がってるのは内緒の方向でお願いします)

techblog.scouter.co.jp

はじめに

今回は前回のブログで言っていたユーザー毎に釣りの記録を管理できるようにしました!(あと何もやってなかったスタイルも少しだけ笑)

f:id:hiroki-nishizawa:20180917060008j:plain

f:id:hiroki-nishizawa:20180917060014j:plain

f:id:hiroki-nishizawa:20180917060017j:plain

ディレクトリについてしばらく書いていなかったので軽く書こうかと思います!

Model

User.php
Post.php

Controller

HomeController.php
PostsController.php

Views

resources
 └── views
      ├── auth
      │   ├── passwords
      │   │   ├── email.blade.php
      │   │   └── resets.blade.php
      │   └── login.blade.php
      │   └── register.blade.php
      ├── layouts
      │   └── app.blade.php
      └── posts
      │    ├── create.blade.php
      │    ├── delete.blade.php
      │    └── edit.blade.php
      ├── home.blade.php
      └── welcome.blade.php

この中で今回のユーザー毎に表示や作成出来るようにするためにModelとControllerファイルを変更しました!

モデル

UserとPostsの関係は1対多と呼ばれる関係です!

ユーザーは複数の記録を保存できるので、Userは複数のPostを保存する 1つの記録の情報は1人しか存在しないのでPostは1つのUserしか持ちません! 上記の関係に基づき、各モデルにはこのように関数を追記しました!!(リレーション)

User.php

<?php
public function posts()
{
    return $this->hasMany('App\Post');
}

Post.php

<?php
public function user()
{
    return $this->belongsTo('App\User');
}

コントローラー

HomeController.php

<?php
public function index(Request $request)
{
    $user = $request->user();
    $posts = $user->load('posts');
    return view('home', ['posts'=>$posts->posts]);
}

PostsController.php

<?php
public function create()
    {
        return view('posts.create');
    }

    public function edit(Post $post)
    {
        return view('posts.edit')->with('post', $post);
    }

    public function post(PostRequest $request)
    {
        $post = new Post();
        $post->fish_name = $request->fish_name;
        $post->year = $request->year;
        $post->month = $request->month;
        $post->day = $request->day;
        $post->prefecture = $request->prefecture;
        $post->place = $request->place;
        $post->user_id = $request->user()->id;
        $post->save();
        return redirect('/home');
    }

    public function update(PostRequest $request, Post $post)
    {
        $post->fish_name = $request->fish_name;
        $post->year = $request->year;
        $post->month = $request->month;
        $post->day = $request->day;
        $post->prefecture = $request->prefecture;
        $post->place = $request->place;
        $post->save();
        return redirect('/home');
    }

    public function delete(Request $request)
    {
        $post = Post::find($request->id);
        return view('posts.delete')->with('post',$post);
    }

    public function remove(Request $request)
    {
        $post = Post::find($request->id);
        $post->delete();
        return redirect('/home');
    }

実際に変更点があったのはpostだけになります。 user_idを取得するために$post->user_id = $request->user()->id;になっています!

躓いた点

リレーションと関係あるかはわからないですが、postをユーザー管理を出来るようにuser_idを作ってから送信しようとしたらUnknown column 'updated_at'というエラーが出てくるようになりました。 調べてみたところpublic $timestamps = false;でupdate_atを更新するのを回避できると書いてあったので試しにやってみたら次はcreated_atがないよーと怒られました。。。 postなのに作成日時はないとだめなのかな??

migrationファイルを見てみると作成した時からあるcreatedとmodifiedがありましたが、update_atはありませんでした。なのでcreatedとmodified($table->datetime('created');、$table->datetime('modified');)を削除してtimestamps($table->timestamps();)を入れることにより対応できました!

最後に

だんだんlaravelの内容が難しくなってきて、実装と文章にするのが難しくなってきましたーーー泣 分かりづらかったら申し訳ございません。

今は全てapp直下のmodelとcontrollerファイルだけを使って書いていますが何かほかのrepositoryファイルとかも使って作成していこうかと思います!

先週nuxtmeetup#5のイベントを公開したので興味あれば是非参加してください!! nuxt-meetup.connpass.com

ありがとうございました!