Doctrine2 - 如何动态分类关系的结果?

时间:2018-03-27 15:31:50

标签: php doctrine-orm

我需要什么:

我正在构建一个返回用户和一些关系的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数据。然后,usersUserTransformer转换,以便以特定格式(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:抱歉(可能)英语不好,这不是我的母语。

1 个答案:

答案 0 :(得分:1)

在你的getComments函数中应用标准,如

library(httr)

apikey <- "foo"
pass <- "bar"

orders <- GET(
  url = "https://yourshop.myshopify.com/admin/orders.json", 
  authenticate(user = apikey, password = pass)
)

content(orders)