以前の記事でデータベースにアプローチする方法を記載しました。
- DBクラス(クエリビルダ): Controller内に記述します。
- Eloquent(ORM) :Modelを生成して使用します。
MVCモデルを使って実装していきたいので、Eloquent(ORM)「エロクアント」の使い方について学んでいきます。
EloquentはORM(Object-Relational Mapping) です。
RDBのテーブルやレコードをPHPのオブジェクトのように扱うことが出来るようになります。
Eloquentを使用する場合、各データベーステーブルに対応する「モデル」があり、そのテーブル操作に使用します。Eloquentモデルは、データベーステーブルからレコードを取得するだけでなく、テーブルへのレコード挿入、更新、削除も可能です。
上記の通り、Eloquentを使用するには対象のテーブルに対応するモデルがあり、それに対して操作を行うとのことです。
また前回の記事にも書きましたが、モデル名はテーブル名に対応したものにする必要があります。
再度書いておきます。
テーブル名
別の名前を明示的に指定しない限り、クラスの複数形の「スネークケース」をテーブル名として使用します。
Modelの作成
とりあえずModelを作ってみます。
Userモデルを作ろうと思ったのですがなぜか最初から存在しています。
Productモデルを代わりに作成します。
$php artisan make:model Product
app/Models/Product.phpが以下のように生成されました。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
}
マイグレーションファイルの作成
マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。
上記の公式の説明があるようにデータベース特にテーブルのバージョン管理みたいなものです。開発中あるいは開発後でもバグ対応、仕様追加、パフォーマンスのためにテーブル構造は変わっていきます。
テーブルの変更を適用するためのSQL文を作成して実行しても構いませんが管理が大変になっていきます。
最初からテーブル構造のバージョン管理ができる機能があるのは便利ですね。
変更があってもレポジトリから最新のマイグレーションファイルを取得してartisanコマンドを実行すれば最新の状態になります。
実際にModel Productに対応したテーブルを作成するためのマイグレーションファイルを生成してみます。
$php artisan make:migration create_products_table
こんな感じでコマンドを実行するとdatabase\migrations/2023_04_10_075612_create_products_table.phpが以下のように生成されました。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('products');
}
};
ただこれだけだと、idとタイムスタンプしかないので編集していきます。
プライマリーキーは、product_idにしました。以下のように設定します。
protected $primaryKey = 'product_id';
|
マイグレーションファイル
|
$php artisan migrate
を実行すると以下のようにテーブルが作成されました。
|
コマンド実行してテーブルを新規作成する |
DBを確認すると以下のようにテーブルが作成されていました。
|
作成されたテーブル |
シーダーを使った初期データ登録
開発を行うに当たってマスターテーブルの初期データやテスト用のデータが必要となります。
Product用のシーダーを作成します。
$php artisan make:seeder ProductSeeder
を実行すると
database/seeders/ProductSeeder.phpが生成されました。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class ProductSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
//
}
}
上記のようにrun()メソッドがあるだけです。
ここに初期データを記載していきます。Eloquentを使って1件のデータを作成してみます。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Product;
class ProductSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
Product::create([
'product_name' => 'Test1',
'product_price' => 100,
]);
}
}
$php artisan db:seed --class ProductSeeder
を実行します。
想定したレコードがproductsテーブルに挿入されました。
設定したのは、”product_name”、”product_price” のみです。他のカラムは自動的に設定されました。
プライマリーキーも自動で1が設定されています。