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

can*_*era 5 database-design doctrine join lookup-tables doctrine-orm

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

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

为了使我的数据模型尽可能精简,我使用" Bill Karwin技术 "跳过查找表中的"id"列,只使用实际值作为主键.这样,您不需要进行连接以获取主表中的值,因为它已经作为外键存在.

问题是,Doctrine对所有关联使用对象引用,这意味着查询仍然需要连接到查找表 - 即使主表已经具有我需要的值.

例如,此查询不起作用:

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country'))
   ->from('Entity\Address', 'a');
Run Code Online (Sandbox Code Playgroud)

相反,你必须这样做:

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country'))
   ->from('Entity\Address', 'a')
   ->join('a.country', 'c');
Run Code Online (Sandbox Code Playgroud)

否则,您会收到此错误:"无效的PathExpression.必须是StateFieldPathExpression."

添加查找表所需的所有连接,并且在我的查询中存在大量不必要的成本.

有没有人知道避免在Doctrine 2中执行查找/引用表连接的好方法?

(PS - 我更愿意避免使用ENUM,因为它们不受Doctrine的支持,并且还有其他明显的缺点.)

Zol*_*aKt 6

是的,这种情况很糟糕,但我猜他们有充分的理由这样做.

您可以使用HINT_INCLUDE_META_COLUMNS提示.它将包括查询结果中的所有字段,包括映射为关系的外键.

$query = \Doctrine::em()->createQuery($queryString)
    ->setParameters($params)
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE);
Run Code Online (Sandbox Code Playgroud)

因此,如果您在数据库city_id中的Address表中有一个字段,它也将在查询结果中与"标准"城市关系一起输出.