2012-03-21 10 views
1

Datamapper ORM 1.8.2.1とCodeIgniter 2.1.0を使用していて、親の中から新しく追加された関連オブジェクトにアクセスする際に問題があります。Datamapper ORMで新しく保存された関連オブジェクトへのアクセス方法

私はこのような親クラスがあります。このような

class Virement extends DataMapper 
{ 
    var $has_many = array("lignevirement"); 
    // ... 
} 

と子クラス:ユーザーコードで

class LigneVirement extends DataMapper 
{ 
    var $has_one = array("virement"); 
    // ... 
} 

を、私はこの親のインスタンスを作成し、いくつかの子オブジェクトを追加します。

$vrt = new Virement;  // and do some inits on properties. 
$vrt->save(); 

$lili = new LigneVirement; // do some inits also on properties. 
$lili->save(); 
$vrt->save($lili); 

$lili = new LigneVirement; // do some inits also on properties. 
$lili->save(); 
$vrt->save($lili); 

// ... 

追加した子オブジェクトの直後にカウントすると、0:

echo $vrt->lignevirement->count(); 

...データベーステーブルの外観を取ること親レコードがすべて子レコードがを追加されている、と彼らは親レコードと正しく関連をしている、を追加されていることを示しているのに対し、 。私は、この回避策をしようとすると、ところで

は、私は、子行の正しい数を取得する:

$vrt = new Virement($vrt->id); 

だから何が上記の私のコードで間違っているかもしれませんか?

+0

ビジネスルールの適用上の理由からsave()メソッドをオーバーライドすることがあります。問題があるかどうかわからなければ、回避策は次のようになります:public function save($ prmObject = ""、$ prmRelatedField = ""){... $ this-> get(); }。 get()はオブジェクトツリーに強制的にリロードをかけ、子オブジェクトを利用可能にします。 – IhariR

+0

この回避策のもう一つの進化:もし私が直ちに2つの新しいオブジェクトをインスタンス化し、save()を呼び出すと、Datamapper ORMは混乱しているように見えます。ただし、データベースを調べると、2つの異なるIDが表示されます。保存は正しく行われますが、2つの新しいオブジェクトには正しく入力されません。 ** $ this-> where( "id"、$ this-> id) - > get(); ** – IhariR

+0

私の推測では、どこかに何かがキャッシュされているということです。あなたのデータベースキャッシングクエリの結果は? – swatkins

答えて

0

私の経験では、Datamapperは保存後すぐに関連オブジェクトにアクセスすることはできません。これには、関連するオブジェクトのプロパティの表示も含まれます。すべて、あなたがリダイレクト場合、しかし

$vrt = new Virement; 
$vrt->get_by_id(1); 
$li = new LigneVirement; 
$li->save($vrt); 
echo $li->vrt->id; 

、またはページをリロードし、次に$李オブジェクトをリロード:あなたの例からに従うことを、次のコードは、$のVRTオブジェクトのIDを表示しませます関連商品は期待どおりに入手可能になります。

関連アイテムをすぐに利用できるようにする必要がある場合は、新しい関連オブジェクトを作成し、_id値に基づいてロードすることができます。ような何か:

$vrt = new Virement; 
$vrt->get_by_id(1); 
$li = new LigneVirement; 
$li->save($vrt); 
$vrt_refresh = new Virement; 
$vrt_refresh->get_by_id($li->vrt_id); 
echo $vrt_refresh->id; 

(すでに$のVRTオブジェクトのIDを知っているが、これは一般的な原則であると明らかに上記のコードは、不要になります)。

ちなみに、2つの新しいオブジェクトに同じIDを使用しているDatamapperについてのコメントには、両方のオブジェクトに同じ変数名を使用しないでください。これは私の経験では信頼できないでしょう。代わりに、別の変数名を使用するか、避けられない場合は、 "Clear"メソッドを見てください:http://datamapper.wanwizard.eu/pages/utility.html#clear

関連する問題