Doctrine 转换和验证的主要问题是它默认读取整个数据库和所有表,而不管它们的实体或映射是否存在。即使在调用orm:convert:mapping 或orm:generate:entities 时使用--filter="" 标志
要解决此问题并让 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 来确保映射是同步的。