Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Tabellen überspringen, wenn Doctrine convert-mapping ausgeführt wird

Das Hauptproblem bei der Konvertierung und Validierung von Doctrine besteht darin, dass standardmäßig die gesamte Datenbank und alle Tabellen gelesen werden, unabhängig davon, ob die Entitäten oder Zuordnungen für sie vorhanden sind oder nicht. Auch bei Verwendung des --filter="" Flag beim Aufruf von orm:convert:mapping oder orm:generate:entities

Um dieses Problem zu umgehen und Doctrine Tabellen überspringen zu lassen, die Ausnahmen auslösen, können Sie Doctrine so einstellen, dass nur die gewünschten Tabellen gelesen werden, indem Sie sie mit setFilterSchemaAssetsExpression definieren

$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);

ODER Sie können den Filter für die Verbindung eines bestehenden Entitätsmanagers setzen.

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

Referenz:http://doctrine-orm.readthedocs.org/en /neueste/referenz/konfiguration.html

Zugegeben, dies ist keine Möglichkeit, Doktrin anzuweisen, Ausnahmen zu ignorieren, aber es sollte Ihnen helfen, mit dem Lernen einer bestehenden Anwendung mit einigen spezifischen Tabellen anstelle der gesamten Datenbank zu beginnen.

Als Randnotiz, da Sie erwähnt haben, dass Sie Verknüpfungstabellen haben. Wenn Sie Fremdschlüssel in Tabellen haben, die Sie nicht in den Filter einbeziehen, erstellt die --from-database-Konvertierung dennoch eine Referenz dafür. Sie müssen manuell ändern die Abbildung auf seine Rohform und nicht auf die zugehörige Abbildung von OneToMany, ManyToOne oder ManyToMany.

Anmerkungszuordnung von 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;
}

An

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

Dann vergessen Sie nicht, doctrine orm:validate-schema zu verwenden um sicherzustellen, dass die Zuordnungen synchron sind.