Mysql
 sql >> Database >  >> RDS >> Mysql

salta le tabelle durante l'esecuzione di Doctrine convert-mapping

Il problema principale con la conversione e la convalida di Doctrine è che legge l'intero database e tutte le tabelle per impostazione predefinita, indipendentemente dalle entità o dai mapping esistenti o meno. Anche quando si utilizza il --filter="" flag quando chiami orm:convert:mapping o orm:generate:entities

Per aggirare questo problema e fare in modo che Doctrine salti le tabelle che generano Eccezioni, puoi impostare Doctrine in modo che legga solo le tabelle che desideri, definendole 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);

OPPURE puoi impostare il filtro per la connessione di un Entity manager esistente.

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

Riferimento:http://doctrine-orm.readthedocs.org/en /latest/reference/configuration.html

Certo, questo non è un modo per dire alla dottrina di ignorare le eccezioni, ma dovrebbe aiutarti a iniziare con l'apprendimento su un'applicazione esistente su alcune tabelle specifiche invece che sull'intero database.

Come nota a margine, poiché hai menzionato che hai tabelle di collegamento. Se hai chiavi esterne nelle tabelle che non includi nel filtro, la conversione --from-database creerà comunque un riferimento per esso. Dovrai modificare manualmente la mappatura alla sua forma grezza anziché alla mappatura associata di OneToMany, ManyToOne o ManyToMany.

Mappatura delle annotazioni da 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;
}

A

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

Allora non dimenticare di usare doctrine orm:validate-schema per garantire che le mappature siano sincronizzate.