Roa*_*oaK 3 php mysql entity doctrine-orm zend-framework2
我正在尝试在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...
Run Code Online (Sandbox Code Playgroud)
是否需要更改以将此ID从表单传递到doctrine flush中的数据库?
Doctrine处理@ORM\GeneratedValue(strategy="Identity")每个数据库的不同.在MySql的情况下,它将插入一个生成的值,也称为AUTO_INCREMENT生成的integerID.请查看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...
}
Run Code Online (Sandbox Code Playgroud)
请注意,不提及GeneratedValue注释与GenerateValue(strategy="None").
当然,你可以在创建它之后设置你的ID,但是这个实体的每个实例都需要一个ID,因此最好强制它由你的构造函数来设置它.
所以在你的控制器中,你可能会使用这样的东西
if ($form->isValid() {
$formData = $form->getData();
$checkpoint = new Checkpoints($formData['id']);
}
Run Code Online (Sandbox Code Playgroud)
正如您所提到的,您希望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'
)
)
)
)
);
}
Run Code Online (Sandbox Code Playgroud)
所以现在我们知道提供ID的可用于新Checkpoints实体.