我无法从其他实体按属性排序记录。
我有类employee,它有属性$user,它指向类user,它有属性$active。
现在我想按user.active对员工进行排序,但我不能这样做。我就是这样称呼他们的:

/**
* @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类的属性并抛出
Doctrine\ORM\ORMException

Unrecognized field: user.active

我知道我可以通过QueryBuilder和Joins做到这一点,但是我想让我的代码更具可重用性,而且标准看起来是个不错的选择。
谢谢你的建议!
编辑:
如果我使用findby,那么对字段user.active排序没有问题。我是否应该将此视为匹配方法的限制?很遗憾,因为我需要使用Doctrine\Common\Collections\Criteria。我可以使用findby和order,然后使用matching方法过滤记录,但我更愿意在数据库端这样做。
编辑2:
我用nette和kdyby/条令。不知道user.active是在kdyby/docine中实现的,不是直接在docine中实现的。所以我想这个问题不会被回答。

最佳答案

如果您看看kdyby/docine,is通过自动检测关系并在需要时执行cane seenhere by calling autoJoinOrderBy的连接来扩展findby的功能。
这就是为什么criteria不支持join,而kdyby的findby支持join的原因。
如果您想要以可重用的方式构建条令查询,那么条件并不能帮助您实现这一点,但是有一个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

10-02 00:30
查看更多