Laravelでデータベースの保存処理を作ってみた

前回、LaravelのインストールとAuth機能で管理画面を作成しました。
https://liberty-dock.com/business_post/53044/

Auth機能で作成した管理画面は初期状態だとhomeになっているので、adminに変更して、データベース保存の機能を追加して行きたいと思います。

データベースの保存処理まとめ

今回作成する内容はこれらす。

  • ルーティングの設定
  • フォームの作成
  • バリデーションの作成
  • リレーションの設定
  • 保存処理の作成

ルーティングの設定

ブラウザでアクセスした時に何を表示させるの設定です。

Route::get('foo', function () {
    return 'Hello World';
});

このようにルーティングを設定すると、http://example.com/fooにアクセスしたらHello Worldが表示されます。

ルーティングはcontrollerを指定することも可能です。

Route::get('/user', 'UserController@index');

http://example.com/userにアクセスするとUserControllerで作成したindexが表示されます。

毎回ページを指定するのはめんどくさいので、Route::resourceを使ってまとめて指定することも可能です。

Route::resourceを使ったときの対応表はこちら。

動詞URIアクション
GET/admin/postindex
GET/admin/post/createcreate
POST/admin/poststore
GET/admin/post/{id}show
GET/admin/post/{id}/editedit
PUT/PATCH/admin/post/{id}update
DELET/admin/post/{id}destroy

Auth機能で作ったのでadminの下層ページにpostを作成してRoute::resource設定します。

Route::resource('/admin/post', 'PostController');

ここで設定した、PostContorollerにデータベースへの保存処理を記述していきます。

フォームの作成

フォームはviewで作成します。

blog/resources/views/admin/post/create.blade.phpにフォームを作成します。

セキュリティ対策の@csrf以外は特に変わったところはありません。

actionはRoute::resourceで設定されたstoreにするので/admin/postとなります。

<form action="/admin/post" method="post">
    @csrf
    <div class="form-group">
        <label for="title">タイトル</label>
        <input class="form-control" type="text" name="title" value="">
    </div>
    <div class="form-group">
        <label for="content">本文</label>
        <textarea class="form-control" name="content"></textarea>
    </div>
    <div class="form-group">
        <button class="btn btn-block btn-info">決定</button>
    </div>
</form>

PostControllerのcreate部分に作成したcreate.blade.phpを設定すればフォームの作成は完了です。

コントローラーの作成

PostController.phpを作成します。

$ php artisan make:controller PostController --resource

ログインしないとアクセスできないように、コンストラクタに設定します。

public function __construct()
{
    $this->middleware('auth');
}

createに先程作ったフォームを設定します。

public function create()
{
    return view('admin.post.create');
}

バリデーションの作成

正しい値をデータベースに保存するために、値をチェックします。

laravelにはバリデーションが予め準備されているので、設定するだけでバリデーションを作成できます。

PostContorollerにuse Validatorを宣言し、storeに設定を記述していきます。

public function store(Request $request)
{
    $rules = [
        'title' => 'required',
        'content' => 'required',
    ];
    $messages = [
        'required' => '必須項目です。',
    ];
    Validator::make($request->all(), $rules, $messages)->validate();
}

$rulesにバリデーションの設定を記述し、今回はrequiredで必須好奥に設定します。

$messageはバリデーションに引っかかった場合に表示させるエラーベッセージです。

設定しないとデフォルトで準備されている英語のエラーメッセージが表示されます。

最後のvalidate()は、バリデーションにひっかかったらフォームのページに自動でリダイレクトされる設定です。

リダイレクトされたフォームでエラーメエセージが表示されるようにし、入力されている値はそのままなるように記述します。

<form action="/admin/post" method="post">
    @csrf
    <div class="form-group">
        <label for="title">タイトル</label>
        <input class="form-control" type="text" name="title" value="{{old('title')}}">
        <p>{{$errors->first('title')}} </p>
    </div>
    <div class="form-group">
        <label for="content">本文</label>
        <textarea class="form-control" name="content">{{old('content')}}</textarea>
        <p>{{$errors->first('content')}} </p>
    </div>
    <div class="form-group">
        <button class="btn btn-block btn-info">決定</button>
    </div>
</form>

保存処理の作成

バリデーションを通過したらデータベースへの保存処理を書きます。

まずpostsという名前でデータベースを作成するのでマイグレーションのコマンドを打ちます。

$ php artisan make:migration create_posts_table

作成されたマイフレーションに今回利用するtitleとcontentのカラム追加の記述を書きます。

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('title');
        $table->longText('content');
        $table->timestamps();
    });
}

マイグレーションを実行すればデータベースが作成されます。

$ php artisan migrate

次にmodelを作成します。

$ php artisan make:model Post

modelに利用するカラムを設定します。

設定したカラムしか利用することはできません。

protected $fillable = ['title', 'content'];

保存する準備ができました。

まず、use App\Postで利用するテーブルの宣言をします。

そして、PostControllerのstoreで作ったバリデーションの下に保存処理を記述していきます。

public function store(Request $request)
{
    $rules = [
        'title' => 'required',
        'content' => 'required',
    ];
    $messages = [
        'required' => '必須項目です。',
    ];
    Validator::make($request->all(), $rules, $messages)->validate();

    //保存処理
    $data = $request->except('_token');
    $p = new Post();
    $p->fill($data)->save();
    return redirect('/admin');
}

保存が完了したらリダイレクトさせて保存処理は完了です。

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、会社から独立するために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら