1

我将 Datamapper ORM 1.8.2.1 与 CodeIgniter 2.1.0 一起使用,并且无法从父级中访问新添加的相关对象。

我有一个这样的父类:

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 对两个新对象使用相同 ID 的注释,我会避免对两个对象使用相同的变量名;根据我的经验,这将是不可靠的。相反,使用不同的变量名称,或者(如果这是不可避免的)看看“清除”方法:http ://datamapper.wanwizard.eu/pages/utility.html#clear 。

于 2013-03-07T05:42:58.490 回答