Doctrine:如何按需创建实体相关表? (如果我想保留一个 SQL 架构源)

Doctrine: How to create entity-related tables on demand? (if i want to keep one SQL schema source)

有没有办法告诉 Doctrine 许多实体的名称并创建它们相关的 tables(包括外键等)?


我的场景:

我想在我的 Doctrine 实体中添加注释作为我的数据库模式的唯一来源。这意味着,例如对于测试,我不想在 SQL 文件或其他文件中维护这些信息的 copy

明确地说,我指的是实体 类 中的注释,如下所示:

<?php 

namespace App\Entity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(fields={"email"}, message="There is already an account with this email")
 *
 * @ORM\Table(
 *      uniqueConstraints={
 *          @ORM\UniqueConstraint(name="email", columns={"email"})
 *      }
 * )
 */
class User
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, nullable=false)
     */
    private $email;

    // ...
}

我想做什么:

在我的测试中,我想为 table 创建 User,例如:

<?php


namespace App\Test;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class SomeTestCase extends KernelTestCase
{
    public function setUp()
    {
        // ...

        $this->entityManager = $kernel->getContainer()
            ->get('doctrine')
            ->getManager();
    }

    public function test1()
    {
        // Is there a function available which has this functionality?
        $this->entityManager->createTableForEntity('App\Entity\User'); // <---------

        // ...
    }
}

这可能吗?如果不可能,即使一次创建所有 table 对我来说也可以。

还有其他方法可以实现吗?

我在测试中使用以下方法创建所有 table:

use Doctrine\ORM\Tools\SchemaTool;

$metadatas = $this->entityManager->getMetadataFactory()->getAllMetadata();
$schemaTool = new SchemaTool($this->entityManager);
$schemaTool->updateSchema($metadatas);

在 MetadataFactory class 上有一个方法 getMetadataFactory() 所以我想如果你只想创建一个 table.

下面的方法也应该有效
$metadata = $this->entityManager->getMetadataFactory()->getMetadataFor('App\Entity\User');
$schemaTool = new SchemaTool($this->entityManager);
$schemaTool->updateSchema($metadata);