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.