3

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

我有 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与 order 一起使用,然后使用匹配方法来过滤记录,但我宁愿在数据库端这样做。

编辑2:

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

4

1 回答 1

1

如果您查看 Kdyby/Doctrine,它通过自动检测关系并在需要时执行连接来扩展 findBy 功能,如通过调用 autoJoinOrderBy 在这里看到的。这就是标准不支持连接的原因,而 Kdyby 的 findBy 支持。

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

QueryObject 官方文档

带有示例用法的博客文章

Kdyby/Doctrine 作者关于 Doctrine 和 QueryObject 的演示(来自幻灯片 43)

有关 QueryObjects 的更多官方信息

于 2019-02-11T19:15:09.363 回答