In Doctrine, how to ignore specific column from update schema command?

不想你离开。 提交于 2020-01-15 02:38:48

问题


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

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

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

Related issues: https://github.com/doctrine/doctrine2/issues/6434


回答1:


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

Using the onSchemaColumnDefinition Event

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:

Using the onSchemaAlterTableRemoveColumn Event

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();
        }
    }
}

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

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

When running:

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

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

References:

Doctrine schema events

Doctrine Event Listeners



来源:https://stackoverflow.com/questions/53448034/in-doctrine-how-to-ignore-specific-column-from-update-schema-command

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!