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