sql >> Base de Datos >  >> RDS >> Mysql

omitir tablas al ejecutar Doctrine convert-mapping

El problema principal con la conversión y validación de Doctrine es que lee la base de datos completa y todas las tablas de forma predeterminada, independientemente de las Entidades o Asignaciones existentes o no. Incluso cuando se usa el --filter="" marcar al llamar a orm:convert:mapping o orm:generate:entities

Para solucionar este problema y hacer que Doctrine omita las tablas que arrojan excepciones, puedes configurar Doctrine para que solo lea las tablas que quieras, definiéndolas con 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);

O puede configurar el filtro para la conexión de un administrador de entidades existente.

$em->getConnection()->setFilterSchemaAssetsExpression('/^(filtered_table)$/');

Referencia:http://doctrine-orm.readthedocs.org/en /más reciente/referencia/configuración.html

De acuerdo, esta no es una forma de decirle a la doctrina que ignore las excepciones, pero debería ayudarlo a comenzar a aprender sobre una aplicación existente en algunas tablas específicas en lugar de en toda la base de datos.

Como nota al margen, ya que mencionó que tiene tablas de enlaces. Si tiene claves externas en tablas que no incluye en el filtro, la conversión --from-database aún creará una referencia para ello. Tendrá que cambiar manualmente la asignación a su forma original en lugar de su asignación asociada de OneToMany, ManyToOne o ManyToMany.

Asignación de anotaciones desde 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;
}

Para

/**
 * @ORM\Entity
 * @ORM\Table(name="order")
 */
class Order
{
  /** 
   * @var integer
   * @ORM\Column(name="customer", type="integer", nullable=true)
   */
   private customer;
}

Entonces no olvides usar doctrine orm:validate-schema para asegurarse de que las asignaciones estén sincronizadas.