繁体   English   中英

教义2-如何动态排序关系的结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM