在Codeigniter中保存datamapper关系

时间:2012-01-12 19:04:22

标签: php codeigniter codeigniter-datamapper

我从Datamapper开始并遇到一些错误。我想如果我创建一个对象,一个相关的对象,然后我保存关系,这两个对象也都保存了。

$u = new User();
$u->where('id', $id)->get();

$p = new User_profile();
$p->name = 'xx';

$u->save($p);

实际上,如果我这样做,则不保存配置文件。当然不是关系。如果我做这样的事情:

$u = new User();
$u->where('id', $id)->get();

$p = new User_profile();
$p->save();
$p->name = 'xx';

$u->save($p);

两者都已保存但配置文件完全为空。没有保存任何参数,但id和Datamapper默认(创建和更新)

这种行为是正确的还是我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

一次调用中保存新对象及其关系下的文档:http://datamapper.wanwizard.eu/pages/save.html在一次调用中保存现有对象及其关系部分,它解释了datamapper如何处理这个问题。

发生的事情是save永远不会调用User_profile()。你需要在尚未持久化的对象上调用save(),所以这应该适合你:

$u = new User();
$u->where('id', $id)->get();

$p = new User_profile();
$p->name = 'xx';

$p->save($u);

答案 1 :(得分:1)

$u = new User();
$u->where('id', $id)->get();

//passing the user object $u to the user_profile object ensures that
//data-mapper fills $p with any related information in the database if that exists
//or just the id attribute for the relationship.
//This way, $p will not be empty even though its fields might not b complete,
//but the relating attribute which should be 'user_id' will have a valid value
//in the 'profiles' table
$p = new User_profile($u);

$p->name = 'xx';

$u->save();
$p->save();

在此结束时,对象$ p现在将具有以下最小值

echo $p->user_id   //prints out $id;
echo $p->name      //prints out xx.

在调用save方法之后,如果数据在之前不存在,或者如果这样的行已经存在则作为更新存在,它们肯定必须保存为配置文件表中的新条目。

希望这能解决你的问题。