繁体   English   中英

学说迁移忽略@Entity 定义中的@Table 注释

[英]Doctrine migration ignores @Table Annotation in @Entity definition

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

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

  • 主要 (id)
  • 标识符(identifier),唯一

媒体.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"}) 
 *    }
 * )
 */

首先,同一个类有多个注释块。 只需合并它们并为该实体提供一个注释块。

并且您直接使用了多个注释,但没有导入它们的定义 具体来说:

  • @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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM