Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codeigniter 如何在Datamapper ORM中访问新保存的相关对象_Codeigniter_Codeigniter Datamapper - Fatal编程技术网

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

Codeigniter 如何在Datamapper ORM中访问新保存的相关对象,codeigniter,codeigniter-datamapper,Codeigniter,Codeigniter Datamapper,我正在使用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

我正在使用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");
    // ...
}
还有这样一个儿童班:

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”方法:。

出于业务规则实施的原因,我覆盖了save()方法。在不知道这是否与问题有关的情况下,解决方法如下:公共函数save($prmObject=“”,$prmRelatedField=“”){…$this->get();}。get()似乎强制重新加载对象树并使子对象可用。这种解决方法的另一个演变:如果我立即逐个实例化两个新对象并对其调用save(),Datamapper ORM似乎会混淆,并为这两个对象恢复一个相同的id。但是,当您查看数据库时,会看到两个不同的ID,即保存操作正确,但两个新对象没有正确填充。为了解决这个问题,前面的get()代码变成:$this->where(“id”,$this->id)->get();我的猜测是有些东西被缓存在某个地方——您的数据库是否缓存查询结果?