11

データベースのビューにマップする Doctrine Entity を定義しました。すべてが正常に機能し、エンティティ関係は期待どおりに正常に機能します。

問題はorm:schema-manager:update、CLI で実行すると、このエンティティに対してテーブルが作成されることです。これは、防止したいことです。このエンティティのビューは既に存在するため、テーブルを作成する必要はありません。

すべてのエンティティ関連機能 (関連付けなど) へのアクセスを維持しながら、テーブルが作成されないように、エンティティに注釈を付けることはできますか?

4

5 に答える 5

15

Symfony2 を使用している場合は、Marco Pivetta の投稿に触発された ChrisR の元の alswer に基づいて、ここにソリューションを追加します。

Symfony2 は、\Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand にある元の Doctrine コマンドを使用していないようです。

代わりに、バンドル内のものを使用します: \Doctrine\Bundle\DoctrineBundle\Command\Proxy\UpdateSchemaDoctrineCommand

したがって、基本的には拡張する必要があるクラスであり、最終的には次のようになります。

src/Acme/CoreBundle/Command/DoctrineUpdateCommand.php:

<?php

namespace Acme\CoreBundle\Command;

use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Doctrine\ORM\Tools\SchemaTool;

class DoctrineUpdateCommand extends \Doctrine\Bundle\DoctrineBundle\Command\Proxy\UpdateSchemaDoctrineCommand {

  protected $ignoredEntities = array(
      'Acme\CoreBundle\Entity\EntityToIgnore'
  );

  protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas) {

    /** @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
    $newMetadatas = array();
    foreach ($metadatas as $metadata) {
      if (!in_array($metadata->getName(), $this->ignoredEntities)) {
        array_push($newMetadatas, $metadata);
      }
    }

    parent::executeSchemaCommand($input, $output, $schemaTool, $newMetadatas);
  }

}
于 2014-09-20T12:46:01.303 に答える
8

最終的にはかなり単純で、\Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand自分の CLI コマンドにサブクラス化するだけで済みました。$metadatasそのサブクラスで、渡される配列をフィルター処理しexecuteSchemaCommand()てから、親関数に渡します。

この新しいサブクラス化されたコマンドを、doctrine cli スクリプトで使用している ConsoleApplication に添付するだけで完了です!

$ignoredEntities以下は拡張コマンドです。本番環境では、おそらく構成または何かからプロパティをフェッチしたいと思うでしょう。これはあなたを邪魔するはずです。

<?php
use Symfony\Component\Console\Input\InputArgument,
    Symfony\Component\Console\Input\InputOption,
    Symfony\Component\Console\Input\InputInterface,
    Symfony\Component\Console\Output\OutputInterface,
    Doctrine\ORM\Tools\SchemaTool;

class My_Doctrine_Tools_UpdateCommand extends \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand
{
    protected $name = 'orm:schema-tool:myupdate';

    protected $ignoredEntities = array(
        'Entity\Asset\Name'
    );

    protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas)
    {
        /** @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
        $newMetadatas = array();
        foreach($metadatas as $metadata) {
            if(!in_array($metadata->getName(), $this->ignoredEntities)){
                array_push($newMetadatas, $metadata);
            }
        }

        return parent::executeSchemaCommand($input, $output, $schemaTool, $newMetadatas);
    }
}

PS: 私を正しい軌道に乗せてくれた Marco Pivetta に感謝します。https://groups.google.com/forum/?fromgroups=#!topic/doctrine-user/rwWXZ7faPsA

于 2012-09-27T09:41:51.147 に答える
6

かなり古いものですが、Doctrine2:postGenerateSchemaイベントリスナーを使用する価値のある解決策もありません-私にとっては、 Doctrineクラスをオーバーライドするよりも優れています:

namespace AppBundle\EventListener;

use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;

/**
 * IgnoreTablesListener class
 */
class IgnoreTablesListener
{
    private $ignoredTables = [
        'table_name_to_ignore',
    ];

    public function postGenerateSchema(GenerateSchemaEventArgs $args)
    {
        $schema = $args->getSchema();

        $tableNames = $schema->getTableNames();
        foreach ($tableNames as $tableName) {

            if (in_array($tableName, $this->ignoredTables)) {
                // remove table from schema
                $schema->dropTable($tableName);
            }

        }
    }

}

リスナーも登録します。

ignore_tables_listener:
    class: AppBundle\EventListener\IgnoreTablesListener
    tags:
        - {name: doctrine.event_listener, event: postGenerateSchema }

余分なフックは必要ありません。

于 2016-08-05T15:52:19.010 に答える