オブジェクトの関連フィールドを、構成ファイルでグローバルに、またはクラス全体でではなく、インスタンスごとに自動入力する簡単な方法があるかどうか疑問に思っています。
大量の関数をチェーンせずに、1つのインスタンスに関連するすべてのモデルを含めたいと思いinclude_related()
ます。このようなものがいいでしょう:
$x = new Model();
$x->include_all_related();
オブジェクトの関連フィールドを、構成ファイルでグローバルに、またはクラス全体でではなく、インスタンスごとに自動入力する簡単な方法があるかどうか疑問に思っています。
大量の関数をチェーンせずに、1つのインスタンスに関連するすべてのモデルを含めたいと思いinclude_related()
ます。このようなものがいいでしょう:
$x = new Model();
$x->include_all_related();
芯の中で手を汚さないといけないと思った。なんらかの理由で、$has_many
と$has_one
配列にアクセスできるとは思いもしませんでした。
解決策は簡単でした:
class Model extends Datamapper{
var $has_one = array('foo', 'bar', 'baz');
var $table = 'models';
function __construct($id = NULL){
parent::__construct($id);
}
function include_all_related(){
foreach($this->has_one as $h){
$this->include_related($h['class']);
}
return $this;
}
}
なぜ変数のclass
キーを使用しているのか不思議に思うかもしれません。$h
内部的には、Datamapper ORMは、より大きな配列の一部として他のいくつかのキーも追跡します。電話をかけるとprint_r($h)
、それらを見ることができます。キーは、、およびclass
を追跡します。foo
bar
baz
リレーション定義で有効にできます。特定のインスタンスで有効にする場合は、実行時にそのインスタンスのリレーション構成を変更する必要があります。