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し直せばよいからです。