如何在Datamapper ORM中访问新保存的相关对象

时间:2012-03-21 16:55:33

标签: codeigniter codeigniter-datamapper

我正在使用带有CodeIgniter 2.1.0的Datamapper ORM 1.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);

那么上面的代码可能出现了什么问题?

1 个答案:

答案 0 :(得分: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