Doctrine 迁移忽略@Entity 定义中的@Table 注解

Doctrine migration ignores @Table Annotation in @Entity definition

我在 Symfony 4.2 中有以下 Doctrine 实体:

当我运行 迁移时,不会生成唯一约束和索引。实体的结果只是MySql中的以下索引:

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 之后我在迁移中获得了索引。