Doctrine2:基于实体类生成实体

时间:2016-06-17 03:30:05

标签: php mysql doctrine-orm symfony

我想用不同的名称生成许多相同的表。是否可以使用类似(http://symfony.com/doc/current/book/doctrine.html#add-mapping-information)的映射创建一个实体类,然后运行带参数名称的命令将表创建到数据库中?我已经完成了一个解决方案,但它不是基于实体类。

在构造函数中:

public function __construct()
{
    $this->schema = new \Doctrine\DBAL\Schema\Schema();
    $this->config = new \Doctrine\DBAL\Configuration();
    $this->connection = DriverManager::getConnection($this->connectionParams, $this->config);
    $this->queryBuilder = $this->connection->createQueryBuilder();
    $this->myPlatform = new MySqlPlatform();
    $this->comparator = new \Doctrine\DBAL\Schema\Comparator();
}

比创建功能:

public function setTable($name)
{
$myTable = $this->schema->createTable($name);
$myTable->addColumn("id", "integer", array("unsigned" => true));
$myTable->addColumn("name", "string", array("length" => 32));
$myTable->setPrimaryKey(array("id"));
$myTable->addUniqueIndex(array("name"));

$queries = $this->schema->toSql($this->myPlatform);
$sm = $this->connection->getSchemaManager();
$fromSchema = $sm->createSchema();
$toSchema = $this->schema;

$schemaDiff = $this->comparator->compare($fromSchema, $toSchema);
$queries = $schemaDiff->toSql($this->myPlatform);
$sql = $schemaDiff->toSaveSql($this->myPlatform);
foreach ($sql as $sentence) {
        $this->connection->exec($sentence);
    }
}

是否有任何其他解决方案基于一个带有映射的类和一个带参数$ table_name的命令来创建具有不同名称的同一个表?我正在使用Symfony 3和Doctrine 2。

1 个答案:

答案 0 :(得分:0)

实体类是一个应该与表连接并与之对应的对象。我认为更好的方法是制作一个看起来与您完全一样的EntityAbstractClass,但不使用@ORM \ Table()注释,然后创建扩展EntityAbstractClass的多个实体。

抽象类:

abstract class EntityAbstractClass() {
    // your fields here
}

/**
* @ORM\Table(name="first_table")
**/
class FirstEntityClass extends EntityAbstractClass {

}

/**
* @ORM\Table(name="second_table")
**/
class SecondEntityClass extends EntityAbstractClass {

}

等等。您还可以通过保存短文件以编程方式管理它,然后运行架构更新。

您也可以使用Traits代替Abstract Class:

trait MyEntityTrait {
    // your fields here like:
    /** @ORM\Column() **/
    private $name;
}

并在每个新的实体类中:

/**
* @ORM\Table(name="first_table")
**/
class FirstEntityClass {
    use MyEntityTrait;
}

...