学说:如何按照与标准

时间:2018-05-27 09:10:29

标签: php orm doctrine nette

我无法按其他实体的属性订购记录。

我有类Employee,其属性为$ user,指向类User,其属性为$ 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类的属性并抛出

Doctrine\ORM\ORMException

Unrecognized field: user.active

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

感谢您的建议!

编辑:

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

编辑2:

我使用Nette和Kdyby / Doctrine。我不知道user.active是在Kdyby / doctrine中实现的,而不是直接在Doctrine中实现的。所以我想这个问题不会得到回答..

1 个答案:

答案 0 :(得分:1)

如果您查看Kdyby / Doctrine,它会通过自动检测关系并根据需要执行联接来扩展findBy功能,如here by calling autoJoinOrderBy所示。 这就是标准不支持联接而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