LaravelのMigrationでテーブルを作成して、モデルでテーブル操作する流れ

 

Laravelでデータベースを使用したい場合はモデルの作成とテーブル作成のマイグレーションが必要になります。

 

今回はLaravelを使用してマイグレーションとモデルを作成する手順についてまとめてみたいと思います。

これを書いている時点でLaravelのバージョンは7.3になります。

 

データベースの設定をする

 

データベースを使用するので、まずはlaravelのプロジェクトルートにある.envファイルを設定します。

MySQLを使用する場合は以下項目を設定しておきましょう。

DB_CONNECTION=mysql
DB_HOST=データベースのホスト名
DB_PORT=ポート番号
DB_DATABASE=データベース名
DB_USERNAME=データベースのユーザ名
DB_PASSWORD=データベースのパスワード

SQLiteを使用する場合は以下のようにしておきましょう。

DB_CONNECTION=sqlite
DB_DATABASE=SQLiteのファイルへの絶対パス

 

マイグレーションファイルを作成→実行

 

次にマイグレーションを実行するためにファイルを作成します。

テンプレートはartisanコマンドで簡単に作成できるので、やってみましょう。

$ php artisan make:migration create_messages_table --create=messages
# Created Migration: xxxx_xx_xx_xxxxxx_create_messages_table

以上のコマンドでテンプレートが作成されました。createオプションをつけることで、新規テーブル作成に必要な部分も自動的につけてくれます。

※Laravelではデフォルトでテーブル名を複数形、モデルを単数形の英語で紐づくようになっています。

 

今回できたファイルは以下の通りかと思います。

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

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('messages');
    }
}

upメソッドはマイグレーションを実行されたときに実行されるもので、downメソッドはマイグレーションを戻すときに実行されるものになります。

 

そしてupメソッド内に作成したいに関する情報を追記していきます。

public function up()
{
    Schema::create('messages', function (Blueprint $table) {
        $table->id(); // idという名前の主キー、bigint型のカラムを作成
        $table->bigInteger('user_id'); // user_idというbigint型のカラム作成
        $table->string('message'); // messageというvarchar型のカラム作成
        $table->timestamps(); // create_at, update_atカラム作成
    });
}

$tableで使用できるメソッドは他にもたくさんありますので、調べて見てください。

 

ここまでできたら、実際に実行されるクエリを確認してみましょう。

$ php artisan migrate --pretend
# 実行予定のクエリがが表示される

 

問題なければ以下コマンドでマイグレーションを実行しましょう。

$ php artisan migrate
# Migrating: xxxx_xx_xx_xxxxxx_create_messages_table
# Migrated:  xxxx_xx_xx_xxxxxx_create_messages_table (0.01 seconds)

SQLにログインしてテーブル一覧を見てみると作成されているはずです。

 

さらに以下コマンドでもマイグレーションの状況が確認できます。

$ php artisan migrate:status

Run?というカラムがYesになっていれば、マイグレーションは完了しています。

 

モデルを作成

 

マイグレーションが完了してテーブル作成をしたら、次はテーブルを操作するためにモデルを作成しましょう。

 

これもartisanコマンドで簡単にテンプレートが作成できます。

$ php artisan make:model Message
# Model created successfully.

モデルを作成するときにはテーブル名の単数形にすることで、自動的に紐づくようになっています。

 

また作成されたファイルを確認してみると、テンプレートが作成されているかと思います。

class Message extends Model
{
    //
}

 

この中に必要なプロパティを記載することで、モデルを使用可能にします。

class Message extends Model
{
    // テーブルの紐付け(テーブル名がモデル名の複数形の場合は記述の必要なし)
    protected $table = 'messages';

    // プライマリキー(主キーカラム名がidの場合は記述の必要なし)
    protected $primaryKey = 'id';

    // 更新可能カラム
    protected $fillable = ['user_id', 'message'];
}

 

また、モデル内にメソッドを作成することもできて、実際にコントローラ等で呼び出したときに使用する事ができます。

class Message extends Model
{
    // テーブルの紐付け(テーブル名がモデル名の複数形の場合は記述の必要なし)
    protected $table = 'messages';

    // プライマリキー(主キーカラム名がidの場合は記述の必要なし)
    protected $primaryKey = 'id';

    // 更新可能カラム
    protected $fillable = ['user_id', 'message'];

    // user_idに一致するデータを取得
    public static function getData($user_id) {
        return self::where('user_id', $user_id)->get();
    }

    // データを整形して出力
    public function format() {
        return 'ID:' . $this->user_id . ' 本文:' . $this->message;
    }
}

 

これでモデルの作成は完了しました。

 

コントローラからモデルを呼び出し

 

まずコントローラでモデルを使用できるようにするためにnamespaceをuseしておきます。

use App\Message

 

コントローラでモデルのメソッドを呼び出してみます。先程定義したメソッドにより、以下でユーザIDに一致したデータが取得できます。

$messages = Message::getData($user_id);

 

モデルから取得したデータはforeach可能なので、以下のようにすることで、フォーマットされたメッセージを取得することができます。(bladeテンプレート内でやる場合は@foreachディレクティブを使用します)

foreach ($messages as $message) {
    $message->format();
}

 

最後に

 

以上、マイグレーションからモデル作成までの流れでした。

これでMVCもMの部分を作成することができました。コントローラやビューと連携して、データベースを駆使したアプリケーション開発を進めていきましょう。