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でも実現できるとありがたいです。

いずれにせよ、行う方法はありますので、紹介しました。