Doctrine 迁移忽略@Entity 定义中的@Table 注解
Doctrine migration ignores @Table Annotation in @Entity definition
我在 Symfony 4.2 中有以下 Doctrine 实体:
当我运行 迁移时,不会生成唯一约束和索引。实体的结果只是MySql中的以下索引:
- 主要(id)
- identifier(标识符),唯一
Media.php
<?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"})
* }
* )
*/
首先,同一个 class 有多个注释块。只需合并它们并为该实体提供一个注释块。
并且您直接使用了几个注释,但没有导入它们的定义。具体来说:
@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
之后我在迁移中获得了索引。
我在 Symfony 4.2 中有以下 Doctrine 实体:
当我运行 迁移时,不会生成唯一约束和索引。实体的结果只是MySql中的以下索引:
- 主要(id)
- identifier(标识符),唯一
Media.php
<?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"})
* }
* )
*/
首先,同一个 class 有多个注释块。只需合并它们并为该实体提供一个注释块。
并且您直接使用了几个注释,但没有导入它们的定义。具体来说:
@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
之后我在迁移中获得了索引。