避免在Doctrine 2中加入参考/查找表

时间:2011-11-09 06:22:29

标签: database-design join doctrine doctrine-orm lookup-tables

在我的应用程序中,我有一些简单的引用/查找数据库表,用于在相关表中提供允许值列表。

(您知道,'国家/地区'表中包含地址表'国家/地区'字段中允许的国家/地区列表...)

为了使我的数据模型尽可能精简,我使用“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。)

1 个答案:

答案 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,它也会在查询结果中与“标准”城市关系一起输出。