Mysql 在sonata管理自定义克隆操作中强制自动增加id

Mysql 在sonata管理自定义克隆操作中强制自动增加id,mysql,symfony,doctrine-orm,sonata-admin,symfony-sonata,Mysql,Symfony,Doctrine Orm,Sonata Admin,Symfony Sonata,我正在sonata admin中执行克隆操作——遵循sonata docs的建议: <?php // src/Acme/DemoBundle/Controller/CRUDController.php namespace Acme\DemoBundle\Controller; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Sonata\AdminBundle\Controller\CRUDCo

我正在sonata admin中执行克隆操作——遵循sonata docs的建议:

<?php // src/Acme/DemoBundle/Controller/CRUDController.php

namespace Acme\DemoBundle\Controller;

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;

class CRUDController extends Controller
{
public function cloneAction()
{
    $id = $this->get('request')->get($this->admin->getIdParameter());

    $object = $this->admin->getObject($id);

    if (!$object) {
        throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
    }

    $clonedObject = clone $object;
    $clonedObject->setName($object->getName()." (Clone)");

    $this->admin->create($clonedObject);

    $this->addFlash('sonata_flash_success', 'Cloned successfully');

    return new RedirectResponse($this->admin->generateUrl('list'));
}
}

我认为简单的解决方案是将您的id设置为null,并且在创建克隆对象时,条令会为您生成一个id

$clonedObject = clone $object;
$clonedObject->setId(NULL);
$clonedObject->setName($object->getName()." (Clone)");

Geert是对的,将id设置为
null
是符合原则的方法

但是,您不必在对象中实现
setId
方法,还可以如下重写
\u clone
方法:

public function __clone()
{
    parent::__clone();
    $this->id = null;
    $this->name .= " (Clone)";
}

请参见

实体中的自动$id注释遵从db增量设置。我试过你的方法。当MySQL设置为自动递增且annotation设置为自动时,Id不能为null。我通过做一个prePersist并将新$clonedObject的属性设置为$object来解决这个问题。但这并不是我想要的方式。当我有一些更具体、更不粗糙的东西时,我会发布。谢谢你的回答!我自己也用过,效果也和预期的一样。。。如果id的值为null,则条令将生成一个新实体,并用自动增量值填充id。(当然,这取决于您的注释设置)因此我并不真正了解您的问题所在…当我将$id设置为null或$clonedObject保留$object id时,为插入重复id提供了sql错误如果使用我的示例,您确定为id提供了setter吗?如果你把它设置为null,它会保留id,这是不正常的。我肯定我试过你的例子。这是我第一次尝试的事情之一。这似乎是最自然、最简单的解决方案,但我也犯了同样的错误。如果我不使用创建操作,我可以复制克隆操作,但我必须设置所有属性。是否要使用
parent::\uu clone()
?我们这里没有继承方案,但可能有一些。在这种情况下,最好确定(你的语法是正确的,我的错误)。此外,我们还希望复制所有字段,只需将id设置为null即可。