簡體   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