【问题标题】:Doctrine: How to order by attribute from association with Criteria教义:如何从与标准的关联中按属性排序
【发布时间】:2018-05-27 09:10:29
【问题描述】:

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

我有 Employee 类,它有 $user 属性,它指向 User 类,它有 $active 属性。

现在我想按 user.active 对员工进行排序,但我无法做到。这就是我对 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 没有问题。我应该认为这是 matching 方法的限制吗?很难过,因为我需要使用 Doctrine\Common\Collections\Criteria。我可以使用 findBy 和 order 然后使用 matching 方法来过滤记录,但我宁愿在数据库端这样做。

编辑 2:

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

【问题讨论】:

    标签: php orm doctrine nette


    【解决方案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

    【讨论】:

    • 感谢您的回答。我已经开始使用 Ublaboo/Datagrid,它自己处理过滤,所以这个问题对我来说不再相关了。无论如何,您的建议是正确的:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多