Events 条令添加列onSchemaCreateTable事件

Events 条令添加列onSchemaCreateTable事件,events,doctrine,symfony4,Events,Doctrine,Symfony4,我有很多表关系 我想自动添加一个新列“created_at” 遵循Symfony和条令文件,我对此感到厌倦: app/config/services\u dev.yaml app/src/Event/Listener/ManyToManyListener.php 这永远不会执行SQL语句。 例如,虽然php-bin/console-doctrine:schema:update--dump-sql,但我看不到我的查询。我浏览了doctrine代码,我明白不可能对这些事件执行我想要的操作,因为事件是

我有很多表关系

我想自动添加一个新列“created_at”

遵循Symfony和条令文件,我对此感到厌倦:

app/config/services\u dev.yaml

app/src/Event/Listener/ManyToManyListener.php

这永远不会执行SQL语句。
例如,虽然
php-bin/console-doctrine:schema:update--dump-sql
,但我看不到我的查询。

我浏览了doctrine代码,我明白不可能对这些事件执行我想要的操作,因为事件是在通过列的代码路径之后调度的,例如在
条令\DBAL\Platforms\AbstractPlatform

    if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaCreateTable)) {
        $eventArgs = new SchemaCreateTableEventArgs($table, $columns, $options, $this);
        $this->_eventManager->dispatchEvent(Events::onSchemaCreateTable, $eventArgs);

        if ($eventArgs->isDefaultPrevented()) {
            return array_merge($eventArgs->getSql(), $columnSql);
        }
    }
因此,处理此事件的唯一方法是
preventDefault
并自己创建SQL


通过查看代码,我找到了更好的方法: 我修改了由
Doctrine\ORM\Tools\SchemaTool->getSchemaFromMetadata

不确定这是不是最好的方法,但它非常有效

    App\EventSubscriber\ManyToManyListener:
        tags:
            - { name: doctrine.event_listener, event: postGenerateSchema }
类SchemaGeneratorListener
{
公共函数postGenerateSchema(GenerateSchemaEventArgs$event)
{
$tables=$event->getSchema()->getTables();
foreach($tables作为$table){
$columns=$table->getColumns();
if(count($columns)getSchema()->getTable($table->getName())->addColumn(
“创建于”,
“日期时间”,
[“默认值”=>“当前时间戳”]
);
}
}
}
}

我浏览了条令代码,我明白不可能对这些事件执行我想要的操作,因为事件是在通过列的代码路径之后调度的,例如在
条令\DBAL\Platforms\AbstractPlatform

    if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaCreateTable)) {
        $eventArgs = new SchemaCreateTableEventArgs($table, $columns, $options, $this);
        $this->_eventManager->dispatchEvent(Events::onSchemaCreateTable, $eventArgs);

        if ($eventArgs->isDefaultPrevented()) {
            return array_merge($eventArgs->getSql(), $columnSql);
        }
    }
因此,处理此事件的唯一方法是
preventDefault
并自己创建SQL


通过查看代码,我找到了更好的方法: 我修改了由
Doctrine\ORM\Tools\SchemaTool->getSchemaFromMetadata

不确定这是不是最好的方法,但它非常有效

    App\EventSubscriber\ManyToManyListener:
        tags:
            - { name: doctrine.event_listener, event: postGenerateSchema }
类SchemaGeneratorListener
{
公共函数postGenerateSchema(GenerateSchemaEventArgs$event)
{
$tables=$event->getSchema()->getTables();
foreach($tables作为$table){
$columns=$table->getColumns();
if(count($columns)getSchema()->getTable($table->getName())->addColumn(
“创建于”,
“日期时间”,
[“默认值”=>“当前时间戳”]
);
}
}
}
}

您能重新表述这个问题吗?在创建表时,您不想更改表。您所需要做的就是添加额外的列,您可以通过添加新键轻松完成。Event有另一个columns变量,您可以通过$Event->getColumns()访问该变量,您可以尝试在那里设置列,看看它是否有效。您好@MaulikParmar,我尝试了
getColumns
方法,但我无法在结果中添加键。您的意思是我可以在哪里添加该键?如果您查看SchemaCreateTableEventArgs的源,事件对象也引用了columns字段,这是从原则传递的。除此之外,作为我建议您不要更改表,因为它不是在连接此函数时创建的。您需要做的是获取条令服务,并根据您的if条件更改表的元数据。这将反映服务容器上下文中的表状态,并且当构建sql以创建表时,它将获取该表元数据。通常,这样的元数据是从yaml或注释中解析,希望这将引导您走上正轨。您能否重新表述问题,在创建表时您不想更改表。您需要做的只是添加额外的列,通过添加新键可以轻松完成。Event有另一个columns变量,您可以通过$Event->getColumns()访问该变量,您可以尝试在那里设置列,看看它是否有效。您好@MaulikParmar,我尝试了
getColumns
方法,但我无法在结果中添加键。您的意思是我可以在哪里添加该键?如果您查看SchemaCreateTableEventArgs的源,事件对象也引用了columns字段,这是从原则传递的。除此之外,作为我建议您不要更改表,因为它不是在连接此函数时创建的。您需要做的是获取条令服务,并根据您的if条件更改表的元数据。这将反映服务容器上下文中的表状态,并且当构建sql以创建表时,它将获取该表元数据。通常,这样的元数据是从yaml或注释中解析,希望这将指导您正确处理问题。
    App\EventSubscriber\ManyToManyListener:
        tags:
            - { name: doctrine.event_listener, event: postGenerateSchema }
class SchemaGeneratorListener
{
    public function postGenerateSchema(GenerateSchemaEventArgs $event)
    {
        $tables = $event->getSchema()->getTables();

        foreach ($tables as $table) {
            $columns = $table->getColumns();
            if (count($columns) <= 2 && !array_key_exists("created_at", $columns)) {
                $event->getSchema()->getTable($table->getName())->addColumn(
                    "created_at",
                    'datetime',
                    ["default" => "CURRENT_TIMESTAMP"]
                );
            }
        }
    }

}