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);
有没有办法告诉 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);