1

CodeIgniter2.1.0でDatamapperORM1.8.2.1を使用していますが、親内から新しく追加された関連オブジェクトにアクセスできません。

私はこのような親クラスを持っています:

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);

では、上記の私のコードの何が問題になっているのでしょうか?

4

1 に答える 1

0

私の経験では、Datamapper は保存直後に関連オブジェクトにアクセスできるようにしません。これには、関連オブジェクトのプロパティの表示が含まれます。あなたの例に続くように、次のコードは$vrt オブジェクトの ID を表示しません。

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

ただし、ページをリダイレクトまたはリロードしてから $li オブジェクトをリロードすると、関連するすべてのアイテムが期待どおりに利用可能になります。

関連アイテムをすぐに利用できるようにする必要がある場合は、新しい関連オブジェクトを作成し、_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 は既にわかっているため、明らかに上記のコードは不要ですが、これが一般的な原則です)。

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

于 2013-03-07T05:42:58.490 に答える