データベースの使い方(モデル編)

モデルとは

モデルとは、MVCアーキテクチャのMの部分であり、アプリケーションのデータ管理とビジネスロジックを担当します。データベースとのやり取りを抽象化し、データの保存、取得、更新、削除、検証、計算などの操作を集中管理します。

Laravelでモデルを作成する

Laravelでモデルを作成するには、以下のコマンドを使用します。ここでは、前回作成したitemsテーブルに対応させるために、itemsの単数形のItemモデルを作成します。

php artisan make:model Item

上記のコマンドを実行すると、app/ModelsにItem.phpが追加されます。Item.phpの中身は以下のようになっています。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    //
}

このコードはModelクラスを継承しています。「//」の記述されている波括弧の中に必要な記述を行っていきます。モデルには数多くの機能を持たせることができますが、ここでは、LaravelからMySQLに新規にデータを保存するのに必要な設定のみを行います。まず、必要なのは、保存できるカラム名を指定することです。Webサーバーにデータを渡してデータベースに保存するような仕組みを実装した場合、簡単にWebサーバーに不正なデータが保存されるようになります。これは、ブラウザから送るデータを自由に操作できるために起こる現象であり、Laravelでは、データベースに登録できるデータを事前に決めることで、不正なデータの混入を防いでいます。追加可能なデータを規定するには以下の方法を使用します。

class Item extends Model
{
    protected $fillable = [
        "name",
    ];
}

fillableはホワイトリスト方式の指定方法であり、上記の指定では、nameというカラムを追加できるように指定しています。一方で、以下のようにすることでブラックリスト方式の指定も可能です。

class Item extends Model
{
    protected $guarded = [
        "id",
    ];
}

上記の指定では、idというカラムをデータとして追加できないようにし、idが勝手に上書きされたり、不正な値が入れられないようにしています。idというカラムはMySQLが自動で採番するものであり、MySQL以外のアプリケーションで変更を加えることがないようにするために設定します。fillableとguardedはどちらか一方を記述します。両方同時に使用することはありません。ここでは、fillableを使用します。

次に、データを追加する処理を追加します。HelloController.phpに次のメソッドを追加します。

public function addItem() {
        $item = new Item();
        $item->name = "test";
        $item->save();

        return view("hello-world");
    }

このコードはItemモデルを作成し、Itemモデルのnameプロパティにtestという値を追加し、saveで保存します。そして、表示するビューは前回作ったhello-worldビューを使用します。この方法では、fillableに指定してない値も入力できてしまうので、fillableを適応したい場合は以下のような処理を行います。

    public function addItem() {
        Item::create([
            "name" => "test",
        ]);

        return view("hello-world");
    }

上記の方法では、モデルクラスのcreateメソッドを使用して必要な値を初期値として代入します。

前者の方法では、fillableが不要で、保存処理の柔軟性が高く、保存前にデータを処理する必要がある場合に有用です。後者の方法はfillableの設定が必要で、配列でプロパティと値を一括にして保存が可能です。

次に、web.phpにルーティングを記述します。

Route::get("/add-item", [HelloController::class, "addItem"]);

通常、データの登録はpostメソッドを使用し、ビューから値を入力、コントローラで処理するという流れを取ります。しかしながら今回は、まだpostメソッドについて説明していないので、postメソッドを使用せずにデータの追加を行います。http://localhost/add-itemにアクセスし、hello-worldビューが表示されることを確認します。その後MySQLにログインし、以下のコードでテーブルの中身を確認します。

select * from items;

上記を実行すると以下のように表示されるはずです。

+----+------+---------------------+---------------------+
| id | name | created_at          | updated_at          |
+----+------+---------------------+---------------------+
|  1 | test | 20XX-XX-XX XX:XX:XX | 20XX-XX-XX XX:XX:XX |
+----+------+---------------------+---------------------+
1 row in set (0.00 sec)

無事、データが挿入されていることがわかります。ちなみにブラウザを更新すると更新した回数だけデータが追加されます。

以上、データの挿入を行うことができました。Laravelでのデータベースの操作は、このモデルを使用します。今回は単純なデータの保存だけを行いましたが、このままでは、保存するデータをブラウザから設定することができません。次回からは、ブラウザからデータを入力するようにする方法などを解説していきます。

コメントを残す

CAPTCHA