SQL-Table Prefixes

This recipe is intended as an example of implementing a loadClassMetadata listener to provide a Table Prefix option for your application. The method used below is not a hack, but fully integrates into the Doctrine system, all SQL generated will include the appropriate table prefix.

このレシピは、loadClassMetadata リスナーを実装して、アプリケーションにテーブル プレフィックス オプションを提供する例として意図されています。以下で使用する方法はハックではありませんが、Doctrine システムに完全に統合されており、生成されるすべての SQL には適切なテーブル プレフィックスが含まれます。

In most circumstances it is desirable to separate different applications into individual databases, but in certain cases, it may be beneficial to have a table prefix for your Entities to separate them from other vendor products in the same database.

ほとんどの場合、異なるアプリケーションを個々のデータベースに分離することが望ましいですが、場合によっては、エンティティにテーブル プレフィックスを付けて、エンティティを同じデータベース内の他のベンダー製品から分離することが有益な場合があります。

Implementing the listener

The listener in this example has been set up with the DoctrineExtensions namespace. You create this file in your library/DoctrineExtensions directory, but will need to set up appropriate autoloaders.

この例のリスナーは、DoctrineExtensions 名前空間で設定されています。このファイルをライブラリ/DoctrineExtensions ディレクトリに作成しますが、適切なオートローダーを設定する必要があります。

<?php

namespace DoctrineExtensions;
use \Doctrine\ORM\Event\LoadClassMetadataEventArgs;

class TablePrefix
{
    protected $prefix = '';

    public function __construct($prefix)
    {
        $this->prefix = (string) $prefix;
    }

    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
    {
        $classMetadata = $eventArgs->getClassMetadata();

        if (!$classMetadata->isInheritanceTypeSingleTable() || $classMetadata->getName() === $classMetadata->rootEntityName) {
            $classMetadata->setPrimaryTable([
                'name' => $this->prefix . $classMetadata->getTableName()
            ]);
        }

        foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
            if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_MANY && $mapping['isOwningSide']) {
                $mappedTableName = $mapping['joinTable']['name'];
                $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
            }
        }
    }

}

Telling the EntityManager about our listener

A listener of this type must be set up before the EntityManager has been initialised, otherwise an Entity might be created or cached before the prefix has been set.

このタイプのリスナーは、EntityManager が初期化される前に設定する必要があります。そうしないと、プレフィックスが設定される前にエンティティが作成またはキャッシュされる可能性があります。

Note

ノート

If you set this listener up, be aware that you will need to clear your caches and drop then recreate your database schema.

このリスナーを設定する場合は、キャッシュをクリアして削除し、データベース スキーマを再作成する必要があることに注意してください。

<?php

// $connectionOptions and $config set earlier

$evm = new \Doctrine\Common\EventManager;

// Table Prefix
$tablePrefix = new \DoctrineExtensions\TablePrefix('prefix_');
$evm->addEventListener(\Doctrine\ORM\Events::loadClassMetadata, $tablePrefix);

$em = new \Doctrine\ORM\EntityManager($connection, $config, $evm);

Table Of Contents

Previous topic

Keeping your Modules independent

モジュールの独立性を保つ

Next topic

Strategy-Pattern

戦略パターン

This Page

Fork me on GitHub