[英]Doctrine migration ignores @Table Annotation in @Entity definition
我在 Symfony 4.2 中有以下 Doctrine 实体:
当我运行迁移时,不会生成唯一约束和索引。 Entity 的结果只是 MySql 中的以下索引:
<?php
// src/Entity/Media.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\UniqueConstraint;
/**
* Common\Model\Entity\Media
*
* @Entity
* @Table(name="media",
* uniqueConstraints={
* @UniqueConstraint(name="virtual_unique",
* columns={"virtualname", "virtualfolder"})
* }
* indexes={
* @Index(name="idx_virtual", columns={"virtualname", "virtualfolder"})
* @Index(name="idx_identifier", columns={"identifier"})
* }
* )
*/
/**
* @ORM\Entity(repositoryClass="App\Repository\MediaRepository")
*/
class Media
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", nullable=true, options={"unique": true})
*/
private $identifier;
/**
* @ORM\Column(type="string", length=255, nullable=false)
*/
private $virtualname;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $virtualfolder;
}
可能您需要将@Table
更改为@ORM\\Table
并删除@Entity
尝试这个:
/**
* @ORM\Entity(repositoryClass="App\Repository\MediaRepository")
* @ORM\Table(name="media",
* uniqueConstraints={
* @UniqueConstraint(name="virtual_unique",
* columns={"virtualname", "virtualfolder"})
* }
* indexes={
* @ORM\Index(name="idx_virtual", columns={"virtualname", "virtualfolder"})
* @ORM\Index(name="idx_identifier", columns={"identifier"})
* }
* )
*/
首先,同一个类有多个注释块。 只需合并它们并为该实体提供一个注释块。
并且您直接使用了多个注释,但没有导入它们的定义。 具体来说:
@Entity
@Index
@UniqueConstraint
@Table
要么你:
@ORM
为前缀(因为您正在use Doctrine\\ORM\\Mapping as ORM
)这是最方便的,也是最常用的。
一个完整的修复:
/**
* Common\Model\Entity\Media
*
* @ORM\Entity(repositoryClass="App\Repository\MediaRepository")
* @ORM\Table(name="media",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="virtual_unique",
* columns={"virtualname", "virtualfolder"})
* },
* indexes={
* @ORM\Index(name="idx_virtual", columns={"virtualname", "virtualfolder"}),
* @ORM\Index(name="idx_identifier", columns={"identifier"})
* }
* )
*/
class Media
{}
您还可以使用具有完整命名空间的注释,例如@Doctrine\\ORM\\Mapping\\Table
、 @Doctrine\\ORM\\Mapping\\UniqueConstraint
等; 但这很快就会变得不必要地冗长。
use Doctrine\ORM\Mapping\Table;
use Doctrine\ORM\Mapping\Index;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\UniqueConstraint;
但这似乎也很浪费。
您将在文档中看到的方法是第一个。 将Doctrine\\ORM\\Mapping
导入为ORM
,并使用悬挂在那里的注释。
我尝试了其他一些建议,但是在cache:clear
我在迁移中获得了索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.