目次
はじめに
Strapi で作成したデータを Next.js で取得する時に、リレーションしたデータの中で拾ってこれないものがあるな?と思ってつまずいてしまったので共有していきたいと思います!
Strapi のリレーション
取得できないリレーションデータというのは画像まわりのところですね。
今回の例では、contents
の作成者としてusers_permissions_user
をリレーションしているのですが、ふつうに取得しようとしてもユーザーのアイコンのデータ
まず、ふつうに取得するときの例から見てみます。
const response = await axios.get(`http://localhost:1337/api/contents`)
console.log(response.data.data)
すると、こんな感じのデータを取得してくることができます。
type StrapiContent = {
id: string
attributes: {
title: string
content: string
createdAt: string
updatedAt: string
publishedAt: string
}
}[]
解決方法
お、やはりusers_permissions_user
がついてこないですね。
公式ドキュメントを読んでみると、リレーションしたデータを取得してくる方法が書いてありますね。
データを取得してくる時にパラメーターとしてpopulate
をつけてあげてhttp://localhost:1337/api/contents?populate****
みたいな感じの設定をしてあげる必要があるそうです。
users_permissions_user
を取得してくるためには、こんな感じの書き方になります。
http://localhost:1337/api/contents?populate=users_permissions_user
すると、狙い通りusers_permissions_user
が取得できるようになりました!
type StrapiContent = {
id: string
attributes: {
title: string
content: string
createdAt: string
updatedAt: string
publishedAt: string
users_permissions_user: { data: [Object] }
}
}[]
users_permissions_user: { data: [Object] }
この中身はどうなっているのかというと
type UsersPermissionsUser = {
id: number
attributes: {
username: string
email: string
provider: string
confirmed: boolean
blocked: boolean
createdAt: string
updatedAt: string
biography: string
}
}
こんな感じで一見取得できているように見えるのですが、肝心のユーザーのアイコン(画像)を取得してくることができていませんね。
users_permissions_user
の持つicon
というデータが必要だったので.
つなぎでこんな感じで取得方法を変えていく必要があるのです。
http://localhost:1337/api/contents?populate=users_permissions_user.icon
すると、icon
のデータを取得してくることができました!!
type UsersPermissionsUser = {
id: number
attributes: {
username: string
email: string
provider: string
confirmed: boolean
blocked: boolean
createdAt: string
updatedAt: string
biography: string
icon: { data: [Object] }
}
}
素晴らしいですね。
公式ドキュメントによると?populate=*
ですべての第一階層のデータを取得してくることができるのですが、パフォーマンス的によろしくないみたいなので、今回紹介したように必要な情報のみ取得できるようにしていきましょう。
また、豆知識ですが、今回のようにユーザーのアイコンだけでなくサムネイルも欲しいな。といった感じで複数取得したい場合にはこんな感じの書き方をします。
http://localhost:1337/api/contents?populate=users_permissions_user.icon,thumbnail
,
でつなぐだけでいいみたいです。
参考
さいごに
最近個人開発で Srapi を触る機会が多いのですが、海外のプロダクトなので日本語の情報が少なかったり実用例がわかりにくかったりするので、もっぱら ChatGPT に手伝ってもらっていますが…
オープンソースで使い勝手のいい HeadlessCMS だと思っているので、日本でもこれから使う人が増えていったらいいなーと思っています。