Doctrine:如何根据与 Criteria 的关联按属性排序

Doctrine: How to order by attribute from association with Criteria

我无法按属性从另一个实体订购记录。

我有 class 个员工,它有属性 $user,它指向 class 个用户,它有属性 $active。

现在我想按 user.active 对 Employee 进行排序,但我无法做到这一点。这就是我对 em 的称呼:

/**
* @param Criteria $criteria
* @param array $order_by
* @param integer $limit
* @param integer $offset
* @return \Doctrine\Common\Collections\Collection
*/
public function findByCriteria($criteria, $order_by = null, $limit = null, $offset = null) {
  $criteria->setFirstResult($offset);
  $criteria->setMaxResults($limit);
  $criteria->orderBy($order_by);

  $result = $this->repository->matching($criteria);

  return $result;
}

我检查了BaseEntityPersister.php,好像没有实现这样的东西。它只是检查 user.active 是否是 Employee class 的属性并抛出

Doctrine\ORM\ORMException

Unrecognized field: user.active

我知道我可以通过 QueryBuilder 和连接来做到这一点,但我想让我的代码更具可重用性,Criteria 似乎是个不错的选择。

感谢您的指教!

编辑:

如果我用findBy,排序字段user.active是没有问题的。我应该认为这是 matching 方法的限制吗?很难过,因为我需要使用 Doctrine\Common\Collections\Criteria。我可以使用 findBy 命令,然后使用 matching 方法来过滤记录,但我宁愿在数据库端这样做。

编辑 2:

我将 Nette 与 Kdyby/Doctrine 一起使用。不知道 user.active 是在 Kdyby/doctrine 中实现的,而不是直接在 Doctrine 中实现的。所以我想这个问题不会有人回答..

如果您查看 Kdyby/Doctrine,它通过自动检测关系并在需要时执行连接来扩展 findBy 功能,如手杖所示 here by calling autoJoinOrderBy。 这就是为什么 criteria 不支持 join 而 Kdyby 的 findBy 支持的原因。

如果你想要可重用的方式来构建 Doctrine 查询,Criteria 不能帮助你,但是有 QueryObject,它做类似的工作并允许你重用逻辑查询部分,但使用 QueryBuilder。 它没有很好的记录,但这里有一些资源:

Official documentation of QueryObject

Blog post with example usage

Kdyby/Doctrine autor's presentation on Doctrine and QueryObject(来自幻灯片 43)

Some more official information about QueryObjects