php - Doctrine:如何根据与 Criteria 的关联按属性排序

标签 php orm doctrine nette

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

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

现在我想按 user.active 对 Employee 进行排序,但我无法做到这一点。这就是我对他们的称呼:

/**
* @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 然后使用 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

Blog post with example usage

Kdyby/Doctrine autor's presentation on Doctrine and QueryObject (来自幻灯片 43)

Some more official information about QueryObjects

关于php - Doctrine:如何根据与 Criteria 的关联按属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50550644/

相关文章:

symfony - 命名空间 "..."不包含任何映射实体

php - 将数据添加到两个以id连接的表中

php - 我如何获取我上传的文件名?

php - 将工作日添加到 SQL 查询

php - Laravel 在 Eloquent ORM 中使用 WHERE

.net - ORM 映射器 .NET linux 服务器

symfony - 将文件名传递给 Symfony\Component\Yaml\Yaml::parse 方法的功能已弃用

php if语句检查当前日期时间是否在2个日期时间列之间

python - SQLAlchemy 和显式锁定

php - Symfony Doctrine Group By Query