Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

pular tabelas ao executar o mapeamento de conversão do Doctrine


O principal problema com a conversão e validação do Doctrine é que ele lê todo o banco de dados e todas as tabelas por padrão, independente das Entidades ou Mapeamentos para elas existentes ou não. Mesmo ao usar o --filter="" sinalizar ao chamar orm:convert:mapping ou orm:generate:entities

Para contornar este problema e fazer com que o Doctrine pule tabelas que lançam Exceções, você pode configurar o Doctrine para ler apenas as tabelas que você deseja, definindo-as com 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 você pode definir o filtro para a conexão de um gerenciador de entidades existente.
$em->getConnection()->setFilterSchemaAssetsExpression('/^(filtered_table)$/');

Referência:http://doctrine-orm.readthedocs.org/en /latest/reference/configuration.html

Concedido, esta não é uma maneira de dizer à doutrina para ignorar exceções, mas deve ajudá-lo a começar a aprender sobre um aplicativo existente em algumas tabelas específicas em vez de todo o banco de dados.

Como uma observação lateral, já que você mencionou que tem tabelas de links. Se você tiver chaves estrangeiras em tabelas que não inclui no filtro, a conversão --from-database ainda criará uma referência para ela. Você precisará alterar manualmente o mapeamento para sua forma bruta em vez do mapeamento associado de OneToMany, ManyToOne ou ManyToMany.

Mapeamento de anotação 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;
}

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

Então não se esqueça de usar doctrine orm:validate-schema para garantir que os mapeamentos estejam sincronizados.