我正在使用带有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);
那么上面的代码可能出现了什么问题?
答案 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。