[英]Doctrine2 - How can I sort dynamicaly the results of a relation?
我正在构建一个返回用户和一些关系的API:我有一个名为“ User”的实体,它具有很多关系。 让我们以“评论”为例:
/**
* @ORM\OneToMany(targetEntity="Comments", mappedBy="idClient", cascade={"persist"})
*/
protected $comments;
在某些情况下,客户端希望在同一查询中获取用户数据和评论数据(通过在“ include query param”中添加“ comments”),并希望按特定顺序对评论进行排序。查询参数中的客户端,在此示例中,注释必须按ID ASC排序。
/api/users?include=comments&sort=comments.id
请注意,在这种情况下,订单ASC是隐式的。
我有一个search()
函数来构建查询:
$qb = $this->createQueryBuilder($this->elementName);
/* SELECTs */
$selects = $this->getSelects($params);
foreach($selects as $select) {
$qb->addSelect($select);
}
/* WHEREs */
$wheres = $this->getWheres($params);
foreach($wheres as $where) {
$qb->andWhere($where);
}
/* ORDER BY */
foreach($sortBy as $column => $order) {
$qb->addOrderBy($column, $order);
}
/* LIMIT and OFFSET */
$qb->setFirstResult($offset)
->setMaxResults($limit);
$query = $qb->getQuery();
$results = $query->getResult();
调用此函数可获取请求的主要数据: users
数据。 然后,通过UserTransformer
转换users
,以便以特定格式(JSONAPI)应答客户端。 稍后通过查询实体是对象转换器来调用这些关系(作为comments
):
$comments = $user->getComments(); // Returning $this->comments in the User class.
return $this->collection($comments, new CommentsTransformer()); // sends the $comments data to the CommentsTransformer.
我尝试将addOrderBy()
应用于查询生成器,但由于DQL不包含任何名为comments.id的关联而收到错误消息:
Doctrine\ORM\Query\QueryException: [Semantical Error] line 0, col 110 near 'id ASC': Error: Class Foo\Users has no field or association named comments.id
这是DQL:
SELECT e FROM Foo\Users u WHERE [...] ORDER BY u.comments.id ASC
有什么方法可以“查看”评论属性并在查询中对它们进行排序?
还是有什么方法可以在我的Users类中插入排序顺序,以便它可以按这种动态顺序检索注释数据? 像使用$ user-> getComments($ sortBy),然后在我的Users类中(最好在我的实体母类中)捕获$ sortBy,并更改内置的Doctrine请求以添加我的排序顺序?
PS:很抱歉(可能)英语不好,这不是我的母语。
在您的getComments函数中应用条件,例如
use Doctrine\Common\Collections\Criteria;
public function getComments()
{
$criteria = Criteria::create()
->orderBy(['id' => Criteria::ASC]);
return $this->comments->matching($criteria);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.