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
Kdyby/Doctrine autor's presentation on Doctrine and QueryObject(来自幻灯片 43)
我无法按属性从另一个实体订购记录。
我有 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
Kdyby/Doctrine autor's presentation on Doctrine and QueryObject(来自幻灯片 43)