Mysql
 sql >> Baza danych >  >> RDS >> Mysql

pomijanie tabel podczas uruchamiania mapowania konwersji Doctrine

Głównym problemem związanym z konwersją i walidacją Doctrine jest to, że domyślnie odczytuje całą bazę danych i wszystkie tabele, niezależnie od tego, czy Entities lub Mapowanie dla nich istnieją, czy nie. Nawet przy użyciu --filter="" flaga podczas wywoływania orm:convert:mapping lub orm:generate:entities

Aby obejść ten problem i aby Doctrine pomijała tabele, które generują wyjątki, możesz ustawić Doctrine tak, aby odczytywał tylko te tabele, które chcesz, definiując je za pomocą 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);

LUB możesz ustawić filtr dla połączenia istniejącego menedżera jednostek.

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

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

To prawda, że ​​nie jest to sposób na nakazanie doktrynie ignorowania wyjątków, ale powinien pomóc w rozpoczęciu nauki o istniejącej aplikacji w określonych tabelach zamiast w całej bazie danych.

Na marginesie, ponieważ wspomniałeś, że masz tabele linków.Jeśli masz klucze obce w tabelach, których nie uwzględniłeś w filtrze, konwersja --from-database nadal utworzy dla nich odniesienie.Będziesz musiała ręcznie zmienić mapowanie do jego surowej postaci, a nie powiązane mapowanie OneToMany, ManyToOne lub ManyToMany.

Mapowanie adnotacji z 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;
}

Do

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

Nie zapomnij użyć doctrine orm:validate-schema aby upewnić się, że mapowania są zsynchronizowane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernuj wysyłanie zbędnych zapytań do bazy danych

  2. jak przechowywać przeanalizowany plik xml w bazie danych sqlite w systemie Android?

  3. Odmowa uprawnień podczas montowania woluminu Docker w OSX

  4. Błąd składni MySQL:blisko „1” w wierszu 1

  5. zend framework połącz 3 stoły