Mysql
 sql >> Base de données >  >> RDS >> Mysql

sauter des tables lors de l'exécution de Doctrine convert-mapping

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.