教义处理@ORM\GeneratedValue(strategy="Identity")
每个数据库都不同。对于 MySql,它将插入一个生成的值,也称为AUTO_INCREMENT
导致integer
作为身份证。请看一下http://docs.doctrine-project.org/en/2.0.x/reference/basic-mapping.html#identifiers-primary-keys 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,因此最好强制它通过构造函数进行设置。
所以在你的控制器中你可能会使用这样的东西
if ($form->isValid() {
$formData = $form->getData();
$checkpoint = new Checkpoints($formData['id']);
}
正如您提到的,您想设置ID
通过您的表格输入。但让我指出,用户可以输入重复的主键。为了捕获它,你必须检查一个对象是否已经存在,在这种情况下我建议使用\DoctrineModule\Validator\NoObjectExists
. See https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md关于学说验证者。
因此,为了检查是否存在具有 ID 的对象,您可以将此验证器添加到表单的输入过滤器中:
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
entity.