如何取消设置克隆的PHP对象的id

Pat*_*ick 3 php doctrine clone auto-increment symfony

我正在开发一个使用Docrtrine和Symfony 2.7的项目.我有一个我想要克隆的Document实体,我当然需要确保我没有重复的主键.这是我到目前为止所尝试的:

/**
 * Document
 *
 * @ORM\Table(name="documents")
 */
class Document {
    public function ___clone(){
        $newObj = clone $this;
        $newObj->id = null;
        return $newObj;
    }
...
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎并不多,因为当我打电话clone myDocument然后尝试坚持时,我仍然得到这样的信息:

SQLSTATE [23000]:完整性约束违规:1062密钥"UNIQ_A2B07288ECC6147F"的重复条目"1"

如何让对象的主键恢复为空或自动递增状态?

=====

Upate:使用

public function __clone(){
    $this->id = null;
}
Run Code Online (Sandbox Code Playgroud)

仍会导致相同的错误.完整错误文字:

执行'INSERT INTO文件(usageFrom,usageTo,status,workflow_identifier,created_date,modified_date,language_id,translationRoot_id,ownerGroup_id,responsible_ser_id,production_id,media_id,created_user,modified_user)VALUES(?,?,?,?,?, ?,?,?,?,?,?,?,?,?)'与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]:完整性约束违规:1062密钥"UNIQ_A2B07288ECC6147F"的重复条目"1"

lxg*_*lxg 6

这不是PHP克隆的工作原理.想想__clone喜欢的__construct.在该__clone方法中,您必须将新值分配给$this.

class Document 
{
    public function ___clone()
    {
        // simple as that
        $this->id = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在您当前的代码中,$newObj将被丢弃,而克隆的对象仍然具有原始ID.

另外,__clone如果要创建深层副本,请记住在方法中克隆子对象,否则最终会引用两个引用相同子级的实体.(或者,在坚持/重新加载之后:其中一个实体将失去其子女.)