在我的应用程序中,我有一些简单的引用/查找数据库表,用于在相关表中提供允许值列表。
(您知道,'国家/地区'表中包含地址表'国家/地区'字段中允许的国家/地区列表...)
为了使我的数据模型尽可能精简,我使用“Bill Karwin technique”跳过查找表中的“id”列,只使用实际值作为主键。这样,您不需要进行连接来获取主表中的值,因为它已经作为外键存在。
问题是,Doctrine对所有关联使用对象引用,这意味着查询仍然需要连接到查找表 - 即使主表已经具有我需要的值。
例如,此查询不起作用:
$qb->select(array('a.id', 'a.street', 'a.city', 'a.country'))
->from('Entity\Address', 'a');
相反,你必须这样做:
$qb->select(array('a.id', 'a.street', 'a.city', 'c.country'))
->from('Entity\Address', 'a')
->join('a.country', 'c');
否则会出现此错误:“无效的PathExpression。必须是StateFieldPathExpression。”
添加查找表所需的所有连接,并且在我的查询中存在大量不必要的成本。
有没有人知道避免在Doctrine 2中对查找/引用表执行连接的好方法?
(P.S。 - 我宁愿避免使用ENUM,因为它们是not supported by Doctrine并且有其他well-documented disadvantages。)
答案 0 :(得分:6)
是的,这种情况很糟糕,但我猜他们有充分的理由这样做。
您可以使用HINT_INCLUDE_META_COLUMNS
提示。它将包括查询结果中的所有字段,包括映射为关系的外键。
$query = \Doctrine::em()->createQuery($queryString)
->setParameters($params)
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE);
因此,如果您在数据库的city_id
表中有一个字段Address
,它也会在查询结果中与“标准”城市关系一起输出。