2010-07-22 49 views
1

我正在加载很多User和相关的Group对象从自定义PDO查询(使用Doctrine连接=> $ dbh = Doctrine_Manager :: connection() - > getDbh();)。查询涉及DQL中不支持的交叉连接。PHP主义 - 完整性约束违规:1062重复条目(主键)

我手动创建的对象和传递的价值观,像这样:

foreach($pdo as $p) {  
     $u = new User(); 
     $u->userid = $p['userid']; 
     $u->username = $['username']; 
     //$u->some_field; skipped on purpose 
     $u->Group->groupid = $['groupid']; 
     $u->Group->groupname = $['groupname']; 
     array_push($return, $set); 
    } 

我希望能够保存User()对象(因为$u->some_field的,可在这种情况下进行更改)。然而,学说试图插入并违反了密钥约束。

据我所知,该错误是抛出,但我希望能够只有更新some_field列(也许最重要的是:不是该组)。 这是所有甚至可能使用上述预加载?

回答

1

那么,你正在创建新的对象,所以教义试图坚持他们。

阅读学说的记录状态:http://www.doctrine-project.org/documentation/manual/1_2/en/component-overview:record:getting-record-state

您可以通过操纵_STATE保护变量影响的记录状态。

另外,看看Doctrine_Record的构造函数。也许以不同的方式创建用户对象会有所帮助:

$u = new User('User', false); 

看起来有点怪异,但如果第一个参数不大于第二给被忽略。第二个参数告诉对象是否是新的,并使得该状态被设置为你想要的。

我也会看看教条如何在内部保存物体。

+0

更改构造函数并没有帮助...我目前使用更新查询来完成魔术,与(内部)记录状态混合似乎不太好,因为它在内部控制权.. ..? – Ropstah 2010-07-24 23:54:24

+0

那么,_state是受保护的,所以所有扩展类都有权使用它。 如果你不想这样做比我试图用Doctrine_Hydrator_RecordDriver保存记录。看看Doctrine_Query_Abstract :: execute()方法,看看教条如何保存对象。 – 2010-07-25 07:32:12

相关问题