Основният проблем с преобразуването и валидирането на Doctrine е, че той чете цялата база данни и всички таблици по подразбиране, независимо от съществуващите или не обектите или съпоставянията за тях. Дори когато използвате --filter=""
флаг при извикване на orm:convert:mapping
или orm:generate:entities
За да заобиколите този проблем и за да имате Doctrine да пропуска таблици, които хвърлят изключения, можете да настроите Doctrine да чете само таблиците, които искате, като ги дефинирате с 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);
ИЛИ можете да зададете филтъра за връзката на съществуващ мениджър на обекти.
$em->getConnection()->setFilterSchemaAssetsExpression('/^(filtered_table)$/');
Справка:http://doctrine-orm.readthedocs.org/en /latest/reference/configuration.html
Разбира се, това не е начин да кажете на доктрината да игнорира изключенията, но би трябвало да ви помогне да започнете да изучавате съществуващо приложение в някои конкретни таблици вместо в цялата база данни.
Като странична бележка, тъй като споменахте, че имате таблици с връзки. Ако имате външни ключове в таблици, които не включвате във филтъра, преобразуването --from-database все пак ще създаде препратка за него. Ще трябва да промените ръчно съпоставянето в необработената му форма, а не свързаното с него картографиране на OneToMany, ManyToOne или ManyToMany.
Съпоставяне на анотации от 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;
}
До
/**
* @ORM\Entity
* @ORM\Table(name="order")
*/
class Order
{
/**
* @var integer
* @ORM\Column(name="customer", type="integer", nullable=true)
*/
private customer;
}
След това не забравяйте да използвате doctrine orm:validate-schema
за да се гарантира, че съпоставянията са синхронизирани.