在Doctrine中,如何从更新模式命令中忽略特定的列? [英] In Doctrine, how to ignore specific column from update schema command?

查看:91
本文介绍了在Doctrine中,如何从更新模式命令中忽略特定的列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个映射的实体,名为产品,只有两列: id 名称

I have my mapped entity named Product, with just two columns: id and name.

如果我手动添加另一列,即 stock_qty 直接用当然,SQL语句,架构更新工具将对其进行远程

If I add another column manually, i.e. stock_qty directly with an SQL statement, the schema update tool will remote it, of course.

如何防止Doctrine删除未映射到我的自定义列实体吗?

How can I prevent Doctrine remove my custom columns, not mapped to my entity?

相关问题: https: //github.com/doctrine/doctrine2/issues/6434

推荐答案

您可以定义 onSchemaColumnDefinition onSchemaAlterTableRemoveColumn 事件并忽略这些列。

You can define either a onSchemaColumnDefinition or a onSchemaAlterTableRemoveColumn event and ignore these columns.

使用onSchemaAlterTableRemoveColumn事件

Using the onSchemaAlterTableRemoveColumn Event

在捆绑包中,创建例如。 src / AppBundle / EventListener / MyEventListener.php:

In your bundle, create eg. src/AppBundle/EventListener/MyEventListener.php:

namespace AppBundle\EventListener;

use Doctrine\DBAL\Event\SchemaColumnDefinitionEventArgs;
use Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs;

class MyEventListener
{
    public function onSchemaAlterTableRemoveColumn(SchemaAlterTableRemoveColumnEventArgs $args)
    {
        $tableColumn = $args->getColumn();
        $table = $args->getTableDiff();
        if($table->name == 'tableName' && $tableColumn->getName() == 'columnName') {
            $args->preventDefault();
        }
    }
}

然后,注册事件监听器在您的服务中:

Then, register your event listener in your services:

services:
    AppBundle\EventListener\MyEventListener:
    tags:
        - { name: doctrine.event_listener, event: onSchemaAlterTableRemoveColumn }

类似,您可以执行以下操作:

Similar, you could do this:

使用onSchemaColumnDefinition事件

Using the onSchemaColumnDefinition Event

在您的捆绑,创建例如src / AppBundle / EventListener / MyEventListener.php:

In your bundle, create eg. src/AppBundle/EventListener/MyEventListener.php:

namespace AppBundle\EventListener;

use Doctrine\DBAL\Event\SchemaColumnDefinitionEventArgs;
use Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs;

class MyEventListener
{
    public function onSchemaColumnDefinition(SchemaColumnDefinitionEventArgs $args)
    {
        $tableColumn = $args->getTableColumn();
        $table = $args->getTable();
        if($table == 'tableName' && $tableColumn['Field'] == 'columnName') {
            $args->preventDefault();
        }
    }
}

然后,注册事件监听器在您的 services.yml 中:

Then, register your event listener in your services.yml:

services:
    AppBundle\EventListener\MyEventListener:
    tags:
        - { name: doctrine.event_listener, event: onSchemaColumnDefinition }

运行时:

php bin/console doctrine:schema:update --force

应忽略指定的列。 (在这种情况下, tableName。 columnName将不会被删除)

should ignore the specified column(s). ("tableName"."columnName" in this case will not be deleted)

引用:

教学模式事件

教学事件监听器

这篇关于在Doctrine中,如何从更新模式命令中忽略特定的列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆