Events 条令添加列onSchemaCreateTable事件
我有很多表关系 我想自动添加一个新列“created_at” 遵循Symfony和条令文件,我对此感到厌倦: app/config/services\u dev.yaml app/src/Event/Listener/ManyToManyListener.php 这永远不会执行SQL语句。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代码,我明白不可能对这些事件执行我想要的操作,因为事件是
例如,虽然
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"]
);
}
}
}
}