cakephperの日記(CakePHP, Laravel, PHP) Twitter


継続的WebセキュリティテストサービスVAddyを始めました!

2015-07-31

LaravelのマイグレーションでView Tableを作成する

Laravel5で試していますがLaravel4でも問題なく動くと思います。

複雑なテーブル構成の場合、LaravelのEloquentなどで頑張ってリレーションの情報を定義して取得するのも良いのですが、書き間違えて違うidを参照してしまったり、メンテナンスする際に毎回確認するのも面倒なので、複雑なテーブルはView Tableにして参照することにしました。

これなら、View Table用のモデルファイルを作ってselect一発で情報が取得できます。その代わり、Lazy Loadingが使えずにjoin結果全てを取得してしまいますのでご注意を。


テストでも利用したいのでマイグレーションで管理することにしました。

下記のように、foo_barというView Tableを作成します。

ファイルは、

database/migrations/2015_07_31_000000_create_foo_bar_table.php

のようにします。

<?php

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

class CreateViewFooBarTable extends Migration {

    public function up()
    {
        DB::statement( 'DROP VIEW IF EXISTS foo_bar' );
        DB::statement( "CREATE VIEW foo_bar AS 
          SELECT * FROM foo INNER JOIN bar ON (foo.id = bar.foo_id)
          " );
    }


    public function down()
    {
        DB::statement( 'DROP VIEW IF EXISTS foo_bar' );
    }

}

もしfoo_barが存在していればDropするようにしています。これは、将来このView Tableに変更が加えられた場合は、通常のテーブルのように差分のみ変更を適用することができないため、もう一度dropしてcreate viewし直す必要があるためです。その時は、このファイルをコピーして新しいマイグレーションファイル名でdropしてcreateし直せばよいからです。

トラックバック - http://d.hatena.ne.jp/cakephper/20150731/1438347861