具有varchar id的Doctrine2实体不会将id插入数据库

时间:2014-07-18 14:21:22

标签: php mysql doctrine-orm zend-framework2 entity

我试图在ZF2应用程序中为Doctrine2创建实体。 我的实体应该有id varchar(15)但是当我试图创建新行时,doctrine2并没有将这个ID推送到数据库中。

在实体生成的类中,我有:

 /**
 * Checkpoints
 *
 * @ORM\Table(name="checkpoints", uniqueConstraints{@ORM\UniqueConstraint(name="sort", columns={"sort"})}, indexes={@ORM\Index(name="country", columns={"country"})})
 * @ORM\Entity
 */
  class Checkpoints
  {
     /**
     * @var string
     *
     * @ORM\Column(name="id", type="string", length=15, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
     private $id;
  // rest of the entity...

我是否需要更改以将此ID从表单传递到doctrine flush中的数据库?

2 个答案:

答案 0 :(得分:5)

Doctrine为每个数据库处理不同的@ORM\GeneratedValue(strategy="Identity")。在MySql的情况下,它将插入一个生成的值,也称为AUTO_INCREMENT,导致integer作为ID。请查看http://docs.doctrine-project.org/en/2.0.x/reference/basic-mapping.html#identifiers-primary-keys

在您的情况下,您不应该使用GeneratedValue注释,包括它的策略。所以完全删除它。如果您需要表单的ID,可以在实体中设置一个构造函数,用于设置该实体的ID。

class Checkpoints {

   public function __constructor($id)
   {
       $this->id = $id;
   }

   /**
     * @var string
     *
     * @ORM\Column(name="id", type="string", length=15, nullable=false)
     * @ORM\Id
     */
     private $id;
  // rest of the entity...
}

请注意,未提及GeneratedValue注释与GenerateValue(strategy="None")相同。

当然,您可以在创建ID后稍后设置ID,但此实体的每个实例都需要一个ID,因此最好强制它由构造函数设置它。

所以在你的控制器中你可能会使用类似这样的东西

if ($form->isValid() {
    $formData = $form->getData();
    $checkpoint = new Checkpoints($formData['id']);
}

正如您所提到的,您希望根据表单的输入设置ID。但我要指出,用户可以放入重复的主键。为了捕获它,你必须检查一个对象是否已经存在,在这种情况下,我建议使用\DoctrineModule\Validator\NoObjectExists。有关Doctrine验证器的信息,请参阅https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md

因此,为了检查对象是否存在ID,您可以将此验证器添加到表单的inputfilter中:

public function getInputFilterSpecification()
{
    $entityManager = $this->serviceManager->get('Doctrine\ORM\EntityManager');

    return array(
        'id' => array(
            'validators' => array(
                array(
                    'name' => 'DoctrineModule\Validator\NoObjectExists',
                    'options' => array(
                        'object_repository' => $entityManager->getRepository('Application\Entity\Checkpoints'),
                        'fields' => 'id'
                    )
                )
            )
        )
    );
}

现在我们知道提供的ID可用于新的Checkpoints实体。

答案 1 :(得分:1)

只需删除

行即可
* @ORM\GeneratedValue(strategy="IDENTITY")

形成您的实体,它会将记录插入您的实体