0

我的 Strapi 设置中有 2 种收藏类型:product产品review有很多评论。

我想在/productsand的响应中添加 2 个新字段/products/:id

averageRaing: number
totalReviews: number

我想覆盖默认find服务来实现这一点,但我无法找到strapi.query("product").find(params, populate)覆盖它的源代码。

如果可能,我需要在单个查询中完成此操作,而不是进行多个查询。

到目前为止,我有:

find(params, populate) {
  return strapi.query("product").model.query(db => {
    // I want the same query as when I run `strapi.query("product").find(params, populate)`
  });
},

但我不确定如何以完全相同的方式处理paramsand 。populate.find(params, populate)

4

1 回答 1

0

在深入研究了源代码后,我找到了一个解决方案:

const { convertRestQueryParams, buildQuery } = require("strapi-utils");

function find(params, populate) {
  const model = strapi.query("product").model;
  const filters = convertRestQueryParams(params);
  const query = buildQuery({ model, filters });

  return model
    .query((qb) => {
      const totalReviewsQuery = strapi.connections
        .default("reviews")
        .count("*")
        .where("product", strapi.connections.default.ref("products.id"))
        .as("total_reviews");

      const averageRatingQuery = strapi.connections
        .default("reviews")
        .avg("rating")
        .where("product", strapi.connections.default.ref("products.id"))
        .as("average_rating");

      query(qb);

      qb.column("*", totalReviewsQuery, averageRatingQuery);
    })
    .fetchAll({
      withRelated: populate,
      publicationState: filters.publicationState,
    })
    .then((results) => results.toJSON());
}
于 2020-10-27T13:29:28.323 回答