如何取消设置克隆的 PHP 对象的 ID
How to unset the id of a cloned PHP object
我正在开发一个使用 Docrtrine 和 Symfony 2.7 的项目。我有一个要克隆的文档实体,当然我需要确保我没有重复的主键。到目前为止,这是我尝试过的:
/**
* Document
*
* @ORM\Table(name="documents")
*/
class Document {
public function ___clone(){
$newObj = clone $this;
$newObj->id = null;
return $newObj;
}
...
}
这似乎没什么用,但是,当我调用 clone myDocument
然后尝试坚持时,我仍然收到此消息:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
'1' for key 'UNIQ_A2B07288ECC6147F'
如何让我的对象的主键恢复为空或自动递增状态?
=====
更新:使用
public function __clone(){
$this->id = null;
}
仍然导致相同的错误。完整错误文本:
An exception occurred while executing 'INSERT INTO documents
(usageFrom, usageTo, status, workflow_identifier, created_date,
modified_date, language_id, translationRoot_id, ownerGroup_id,
responsibleUser_id, production_id, media_id, created_user,
modified_user) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with
params ["2018-06-28 09:54:37", "2018-06-28 09:54:37", 100,
"4cc723c2a5730c1b9c2ed6428ae57205", "2018-06-28 09:54:37", "2018-06-28
09:54:37", null, null, null, null, 1, null, 1, 1]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
'1' for key 'UNIQ_A2B07288ECC6147F'
这不是 PHP’s cloning 的工作方式。把 __clone
想成 __construct
。在 __clone
方法中,您必须将新值分配给 $this
.
class Document
{
public function ___clone()
{
// simple as that
$this->id = null;
}
}
在您当前的代码中,$newObj
将被丢弃,而克隆对象仍具有原始 ID。
此外,如果您想创建深拷贝,请记住在 __clone
方法中克隆子对象,否则您最终会得到两个引用相同子对象的实体。 (或者,在 persisting/reloading 之后:其中一个实体将失去其子实体。)
我正在开发一个使用 Docrtrine 和 Symfony 2.7 的项目。我有一个要克隆的文档实体,当然我需要确保我没有重复的主键。到目前为止,这是我尝试过的:
/**
* Document
*
* @ORM\Table(name="documents")
*/
class Document {
public function ___clone(){
$newObj = clone $this;
$newObj->id = null;
return $newObj;
}
...
}
这似乎没什么用,但是,当我调用 clone myDocument
然后尝试坚持时,我仍然收到此消息:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_A2B07288ECC6147F'
如何让我的对象的主键恢复为空或自动递增状态?
=====
更新:使用
public function __clone(){
$this->id = null;
}
仍然导致相同的错误。完整错误文本:
An exception occurred while executing 'INSERT INTO documents (usageFrom, usageTo, status, workflow_identifier, created_date, modified_date, language_id, translationRoot_id, ownerGroup_id, responsibleUser_id, production_id, media_id, created_user, modified_user) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["2018-06-28 09:54:37", "2018-06-28 09:54:37", 100, "4cc723c2a5730c1b9c2ed6428ae57205", "2018-06-28 09:54:37", "2018-06-28 09:54:37", null, null, null, null, 1, null, 1, 1]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_A2B07288ECC6147F'
这不是 PHP’s cloning 的工作方式。把 __clone
想成 __construct
。在 __clone
方法中,您必须将新值分配给 $this
.
class Document
{
public function ___clone()
{
// simple as that
$this->id = null;
}
}
在您当前的代码中,$newObj
将被丢弃,而克隆对象仍具有原始 ID。
此外,如果您想创建深拷贝,请记住在 __clone
方法中克隆子对象,否则您最终会得到两个引用相同子对象的实体。 (或者,在 persisting/reloading 之后:其中一个实体将失去其子实体。)