Strapi에서 임의로 정렬된 레코드 집합을 얻는 방법

최근에 나는 레코드세트의 세부사항을 보여주는 페이지와 하단에 사용자가 세부사항을 보기 위해 클릭할 수 있는 두 개의 무작위로 선택된 레코드세트를 보여주는 "기타"섹션을 만들어야 했습니다. 물론 "기타"레코드 집합에서는 사용자가 현재 보고 있는 레코드 집합을 볼 수 없습니다.

이 프로젝트 스택은 프런트엔드의 경우 Next.js이고 백엔드의 경우 Strapi입니다. 이 게시물에서는 백엔드 측면에 초점을 맞추고 Strapi 컬렉션 유형의 임의 레코드 집합을 반환하는 방법을 살펴봅니다.

"잠깐만요, Strapi는 사용 가능한 많은 매개변수가 있는 API를 노출합니다. 단순히 매개변수를 전달하면 이 작업이 완료됩니다."라고 생각할 수 있습니다. 문제는... 임의로 정렬하기 위해 _sort 매개변수에 전달할 수 있는 값이 없다는 것입니다.

따라서 임의로 선택한 일부 레코드 집합을 가져오려면 Partnerships 컬렉션 유형에 대한 사용자 지정 끝점을 빌드해야 합니다.

먼저 경로를 추가해야 합니다. api/partnership/config/routes.json에 추가해 보겠습니다.

{
  "routes": [
    {
      "method": "GET",
      "path": "/partnerships/random",
      "handler": "partnership.random",
      "config": {
        "policies": []
      }
    }
  ]
}


좋습니다. 이제 Partnership 컨트롤러에서 random 메서드를 만들 수 있습니다. api/partnership/controllers/partnership.js로 이동하여 덤random 메서드를 구현하여 도달할 수 있는지 확인합니다.

"use strict";

module.exports = {
  async random() {
    return "Hello world"
  }
}


그런 다음 브라우저에서 http://localhost:1337/partnerships/random로 이동하면... HTTP 403 오류가 표시됩니다. 이는 정상이며 기본적으로 Strapi 엔드포인트에 연결할 수 없습니다. Strapi의 관리 UI로 이동하여 설정 > 역할 > 공개에서 random 끝점 사용자 파트너십 모델을 확인해야 합니다.



이 설정을 저장하고 임의 끝점에 도달하도록 다시 시도하십시오. 이제 Hello world 🎉를 보여줍니다.

이제 끝점을 구현할 수 있습니다.

먼저 모든 레코드세트를 무작위로 정렬해야 합니다. 이를 달성하려면 쿼리를 작성해야 합니다. Strapi는 Bookshelf을 ORM으로 사용하고 있습니다. 따라서 파트너십 모델을 가져오는 것으로 시작할 수 있으므로 쿼리를 실행할 수 있습니다. 쿼리 내에서 knex(Bookshelf가 내부적으로 사용하는 쿼리 빌더) 쿼리 빌더 인스턴스를 얻습니다. 이 쿼리 작성기 인스턴스에서 레코드 집합을 무작위로 주문하도록 요청할 수 있습니다. 이것을 시도해 봅시다:

async random() {
  const result = await strapi
    .query("partnership")
    .model.query((qb) => {
      qb.orderByRaw("RANDOM()")
    })
    .fetchAll()

  return result.toJSON()
}

/partnerships/random 끝점에 도달하려고 시도하고 모든 파트너십이 무작위로 정렬되는지 확인합니다. 모든 레코드 세트를 얻으려는 경우 트릭을 수행할 수 있습니다. 하지만 내 경우에는 ID로 일부 레코드 집합을 제외하고 반환되는 레코드 집합의 수를 제한할 수 있기를 원했습니다. 내가 한 방법은 다음과 같습니다.

async random({ query }) {
  const DEFAULT_LIMIT = 10
  const limit = query._limit || DEFAULT_LIMIT
  const excludedIds = query.id_nin || []

  const result = await strapi
    .query("partnership")
    .model.query((qb) => {
      qb
        .whereNotIn("id", excludedIds)
        .orderByRaw("RANDOM()")
        .limit(limit)
    })
    .fetchAll()

  return result.toJSON()
}


이렇게 하면 2개의 임의 파트너십을 얻을 수 있으며 다음을 수행하여 반환된 레코드 집합에서 ID1와의 파트너십을 절대 갖지 않을 것입니다.

const url = new URL("http://localhost:1337/partnerships/random")
url.search = new URLSearchParams({
  "id_nin[]": [1],
  _limit: 2
}).toString()

const response = await fetch(url)
const data = await response.json()


도움이 되길 바랍니다!

Edge2Edge MediaUnsplash님의 표지 사진

좋은 웹페이지 즐겨찾기