9. モデルとデータベース

Laravelのモデル

Modelクラス継承

LaravelのモデルファイルはModelクラスを継承することで、データベース操作が簡単にできるようになっています。

モデルファイル
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    use HasFactory;
}

モデルファイル作成

モデルファイルは make:model で自動作成できます。

ターミナル
php artisan make:model モデル名

Modelの管理フォルダ

モデルファイルは 「app/Models/」をベースに作成されます。

Migrateオプション

「-m」を指定すると、マイグレーションファイル付きで作成します。

ターミナル
php artisan make:model モデル名 -m

データベースの用意

モデルファイルでデータベース操作するには、データベース作成と設定が必要です。今回はMySQLで簡単なデータベースを作成して接続してみましょう。

データベース作成

クライアントツールで作成する場合

「MySQLWorkBench」や「phpMyAdmin」などのクライアントツールで「laravel_sample」データーベースを作成します。

phpMyAdmin
MySQL Workbench

ターミナルで作成する場合

ターミナルでMySQLにログインします。

mysql -u root -p

MySQL初期パスワード

「MAMP」「XAMPP」の初期パスワードです。

  • MAMP(Mac):root
  • XAMPP(Win):なし

DB作成

CREATE DATABASE

DB作成するには「CREATE DATABASE」のSQL文を実行します。

create database データベース名;

MySQLでログインしたら「laravel_sample」を作成します。

create database laravel_sample;

DB接続設定

.env設定

「.env」ファイルはアプリの個別設定をするファイルです。

  • アプリ名
  • DB設定
  • メール設定など

接続設定

「.env」ファイルにある「DB_xxx」の定数に、DB接続設定を記述します。 各種設定は環境によってあわせてください。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_sample
DB_USERNAME=root
DB_PASSWORD=

キャッシュクリア

「.env」ファイルを修正したら、artisanコマンドでキャッシュをクリアします。

php artisan config:cache

DB接続確認

ターミナルからDB接続できるか確認をします。

tinker

tinkerは、REPL(対話式)モードでプログラムを実行できるLaravelのプログラムです。

php artisan tinker

DB接続確認

コマンド入力モードになったら、DB接続プログラムを入力して実行します。

>>> DB::select('select 1');

成功すると以下のような結果が返ってきます。

>>> DB::select('select 1');
=> [
     {#3628
       +"1": 1,
     },
   ]

tinker終了

exit で「tinker」を終了します。

>>> exit

データベースマイグレーション

データベースマイグレーションとは?

Database Migration(データベースマイグレーション)は、ファイルにSQLを記述しDBのテーブル定義の更新履歴管理する仕組みです。

  • テーブル作成・削除
  • カラム追加・カラム削除
  • カラム名、データ型など変更
  • 外部キー設定

Laravelのマイグレーション

「migrations」フォルダ

マイグレーションファイルは「database/migrations/」の中でファイル管理します。

Blueprintライブラリ

LaravelのマイグレーションはBlueprintというスキーマ管理ライブラリでDDL(テーブル定義)をプログラミングします。デフォルトで最低限のプログラムが記載されており、必要な部分を追加してテーブル定義します。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('items');
    }
}
  • up() :マイグレート更新処理
  • down() :ロールバック処理

テーブルとモデル

DBテーブルのデータはモデルファイルを経由して操作します。「Model」クラスとマイグレーションファイルを作成してテーブル定義が必要です。

モデルファイル作成

「Item」モデルをマイグレーションファイル付きで作成します。

ターミナル
php artisan make:model Item -m

モデルファイル確認

「app/Models/」に「Item.php」が作成されました。

Itemモデルには、DBデータを操作できるような最低限のプログラムが作成されています。

App/Models/Item.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    use HasFactory;
}

テーブル定義

今回作成するitemsテーブルの定義です。

itemsテーブル

項目 カラム名 データ型 NOT NULL オプション
ID id bigint unsigned Yes Primary Key, auto_increment
商品名 name varchar(255) Yes
値段 price int Yes
作成日 created_at timestamp Yes
更新日 updated_at timestamp Yes

マイグレーションファイル確認

モデル作成時に「database/migrations/」に「xxxx_create_items_table.php」ファイルが自動作成されているので確認してみましょう。「xxxx」の部分は作成日時でマイグレーションファイルの実行順に関係します。

「items」テーブルのマイグレーションファイルです。

databases/migrations/xxxx_create_items_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('items');
    }
};

カラム追加

「up」メソッドにカラムを追加しますが、SQLでなくPHPプログラム(Blueprint)で記述します。

    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->string('name', 255);
            $table->integer('price');
        });
    }

マイグレート実行

現時点ではDBにテーブルが作成されていないので、migrateコマンドでマイグレート実行をします。

php artisan migrate

マイグレートが成功しました。

テーブル作成確認

テーブルが作成されたか、DBクライアントで確認してみましょう。

Laravel超入門