我正在将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);
那么我上面的代码可能出了什么问题呢?
根据我的经验,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的注释,我会避免对两个对象使用相同的变量名;根据我的经验,这是不可靠的。相反,使用不同的变量名,或者(如果这是不可避免的)看看"Clear"方法:http://datamapper.wanwizard.eu/pages/utility.html#clear。