【PHPでwebアプリを作る:Laravel6】モデルの作成と新規投稿機能編

post Webエンジニア

前の記事ではクエリビルダのinsertを使ってuser登録をしてみる記事を書きました。

write

【PHPでwebアプリ:Laravel6】バリデーション応用とデータベース登録

2019年11月6日

実はLaravelにはEloquentモデルを利用してDBを操作する別の方法があり、こちらの方が主流ですのでそちらで新規投稿の機能を作っていこうかと思います。

モデルの定義

新規投稿用のpostsテーブルを作成します。テーブルの構成は以下の記事を参考に、updated_dateを追加します。

table

【webアプリを作る】データベースの考え方・テーブル設計のやり方編

2019年9月22日

mysqlに入って以下を実行します。

CREATE TABLE posts (
  post_id int(11) NOT NULL auto_increment,
  user_id int(11) NOT NULL,
  post_text text NOT NULL,
  created_at datetime NOT NULL,
  updated_at datetime NOT NULL,
  PRIMARY KEY  (post_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

そしてモデルを作成します。postsテーブルのモデルを作成するにはpostモデルを作成するのが公式ドキュメントでは記載されているのですが個人的な趣味でテーブル名と同じpostsモデルを作成します。

php artisan make:model Posts

これでapp/Posts.phpが作成されます。

新規投稿

前回の記事でログイン後のマイページを作成しました、そこに新規投稿機能を作成していきます。

MypageControllerのデフォルトでmypageのビューを呼ぶようにします。

    public function index()
    {
        return view('mypage');
    }

ビューの中身は以下のような感じ。

<div class="form_box">
    <form action="{{ route('post_add') }}" method="post">
    @csrf
    <div>投稿する</div>
    <div><textarea name="post_text" rows="5" cols="20" class="form-control"></textarea></div>
    @error('post_text')
        <div class="alert alert-danger alert_box">{{ $message }}</div>
    @enderror
    <div><input type="submit" value="送信" class="btn btn-primary"></div>
    </form>
</div>

web.phpでルートも追加しておきます。

Route::post('mypage_add','MypageController@add')->name('post_add');

本来はマイページとは別のコントローラー内(例えばPostControllerを作成)に新規投稿機能は作成するべきかと思いますが、ひとまずこちらではこの形で進めていきます。

addの中身は以下のような形。

use App\Posts;(一番上部分に追記)

    public function add(Request $request)
    {
        $validatedData = $request->validate([
            'post_text' => 'required',
        ]);

        $posts = new Posts;
        $posts->user_id = Auth::id();
        $posts->post_text = $request->input('post_text');
        $posts->created_at = now();
        $posts->save();

        return redirect('mypage');
    }

投稿が成功したらマイページにリダイレクトしているので、マイページのトップでは投稿一覧を取得して表示するように修正していきます。

    public function index()
    {
        $posts = Posts::where('user_id', Auth::id())->get();;

        return view('mypage', ['posts' => $posts]);
    }
<div class="form_box">
    <form action="{{ route('post_add') }}" method="post">
    @csrf
    <div>投稿する</div>
    <div><textarea name="post_text" rows="5" cols="20" class="form-control"></textarea></div>
    @error('post_text')
        <div class="alert alert-danger alert_box">{{ $message }}</div>
    @enderror
    <div><input type="submit" value="送信" class="btn btn-primary"></div>
    </form>
    @foreach ($posts as $post)
    	<hr>
    	<p>{!! nl2br(e($post->post_text)) !!}</p>
    @endforeach
</div>

こちらで以下のように送信した値が表示されていきます。
post

まとめ

以上になります、基本的な流れさえできてしまえばあとは応用とwebサイトの場合はデザインの方が重要だったりもするのでエンジニアとしては枠組み表示でゴールかもしれませんね。

何かあれば公式ドキュメントを探すなり、検索してみるとLaravel情報はよく見つかるので大丈夫だと思います。