Doctrineの変換と検証の主な問題は、エンティティまたはマッピングが存在するかどうかに関係なく、デフォルトでデータベース全体とすべてのテーブルを読み取ることです。 --filter=""
を使用する場合でも orm:convert:mapping
を呼び出すときのフラグ またはorm:generate:entities
この問題を回避し、例外をスローするテーブルをDoctrineにスキップさせるには、setFilterSchemaAssetsExpression
で定義することにより、必要なテーブルのみを読み取るようにDoctrineを設定できます。
$isDev = true;
$config = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration(array('/path/to/entities'), $isDev);
$config->setFilterSchemaAssetsExpression('/^(table1|table2|prefixed_.*|.*_suffixed)$/');
$em = \Doctrine\ORM\EntityManager::create(array(
'driver' => 'db_driver',
'host' => 'localhost',
'user' => 'user_name',
'password' => 'user_password',
'dbname' => 'database',
), $config);
または、既存のエンティティマネージャーの接続にフィルターを設定できます。
$em->getConnection()->setFilterSchemaAssetsExpression('/^(filtered_table)$/');
参照: http://doctrine-orm.readthedocs.org/en /latest/reference/configuration.html
確かに、これは例外を無視するようにDoctrineに指示する方法ではありませんが、データベース全体ではなく、特定のテーブルで既存のアプリケーションの学習を開始するのに役立つはずです。
リンクテーブルがあると述べたので、補足として、フィルターに含めないテーブルに外部キーがある場合でも、-from-database変換によってその参照が作成されます。手動で変更する必要があります。 OneToMany、ManyToOne、ManyToManyの関連するマッピングではなく、生の形式へのマッピング。
doctrine orm:convert:mapping --from-database annotation /path/to/entities
からのアノテーションマッピング
/**
* @ORM\Entity
* @ORM\Table(name="order")
*/
class Order
{
/**
* @var \Customer
* @ORM\ManyToOne(targetEntity="Customer")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="customer", referencedColumnName="id", nullable=true)
* })
*/
private customer;
}
宛先
/**
* @ORM\Entity
* @ORM\Table(name="order")
*/
class Order
{
/**
* @var integer
* @ORM\Column(name="customer", type="integer", nullable=true)
*/
private customer;
}
次に、doctrine orm:validate-schema
を使用することを忘れないでください マッピングが同期していることを確認します。