Le principal problème avec la conversion et la validation de Doctrine est qu'il lit l'intégralité de la base de données et toutes les tables par défaut, quelles que soient les entités ou les mappages existants ou non. Même en utilisant le --filter=""
drapeau lors de l'appel de orm:convert:mapping
ou orm:generate:entities
Pour contourner ce problème et faire en sorte que Doctrine ignore les tables qui génèrent des exceptions, vous pouvez configurer Doctrine pour qu'il ne lise que les tables souhaitées, en les définissant avec setFilterSchemaAssetsExpression
$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);
OU vous pouvez définir le filtre pour la connexion d'un gestionnaire d'entités existant.
$em->getConnection()->setFilterSchemaAssetsExpression('/^(filtered_table)$/');
Référence :http://doctrine-orm.readthedocs.org/en /dernière/référence/configuration.html
Certes, ce n'est pas une façon de dire à la doctrine d'ignorer les exceptions, mais cela devrait vous aider à commencer à apprendre sur une application existante sur certaines tables spécifiques au lieu de la base de données entière.
En remarque, puisque vous avez mentionné que vous avez des tables de liens. Si vous avez des clés étrangères dans des tables que vous n'incluez pas dans le filtre, la conversion --from-database créera toujours une référence pour celle-ci. Vous devrez modifier manuellement le mappage à sa forme brute plutôt qu'au mappage associé de OneToMany, ManyToOne ou ManyToMany.
Mappage d'annotations à partir de 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;
}
Alors n'oubliez pas d'utiliser doctrine orm:validate-schema
pour s'assurer que les mappages sont synchronisés.