Laravel4、Eloquentのテーブルを動的に切り換える
タグ: Laravel4
標準的なEloquentとテーブルの関係は、モデル名が先頭を大文字にした英単語の単数形、テーブルは全部小文字で複数形です。(大文字、小文字の部分は内部で変換しているかも知れません。)
このデフォルト規約に従わなくても、Eloqunetモデルクラスの中で明示的に、テーブル名を指定してあげる事も可能です。
protected $table = 'users';
同じ構造を持つテーブルを動的に切り替えて操作できると便利なことがあります。その場合は、setNameで切り替えます。例えばAppleモデルがある場合、以下の通りです。
$apple = Apple::create(); // もしくは $apple = new Apple(); $apple->setName('new_tables'); $apple->fill(array('field1'=>'value',...)); $apple->save();
多分、試していませんが、これでもいけると思います。
$apple = Apple::create(array('field1') => 'value', ...)); $apple->setName('new_tables'); $apple->save();
本当は、以下のように指定したいのですが、出来ないためGithubに投げたのです。
$apple = new Apple(); $apple->setName('new_tables'); ... $new_apple = $apple->create();
$new_appleには新しいAppleモデルのインスンタンスが入るのですが、対象となるテーブルはデフォルトの命名規則、もしくは$table設定値になり、'new_tables'にはなりません。
createメソッドは単に新しいインスタンスを内部でnewしているだけなので、その新しいインスタンスに、親の$tableの値を渡してもらうか、cloneしてもらえばいいんですが、このissueはcloseされてしまいました。イメージ的にORMモデルから、createメソッドで新しいインスタンスを生成したら、親の状態を引き継ぐほうが自然だと思えるんですが、しょうが無いですね。マイナーな部分ですからね。
余り使い道が無さそうに思えるでしょうが、ちょっと複雑な何かの管理ロジックを組む場合なら、同じ構造のテーブルを切り替えて使用できるのは、大変便利です。通常は生SQLかクエリービルダーを使用すれば済みますが、Eloquentの記述性を活かしたい場合は、やはりEloquentでも実現できるとありがたいです。
いずれにせよ、行う方法はありますので、紹介しました。