Help us understand the problem. What is going on with this article?

【CraftCMS】エントリフィールドをキーとしてエントリを取得する

More than 1 year has passed since last update.

ちょっと何言ってるか分からない

誰もこんなことやらねーよな事案かもしれないが実際あったケースなので残す。

エントリフィールドを持つ、とあるセクションのエントリを起点として
そのフィールドに登録されているエントリを取得する

たった1文で3回エントリという言葉が出て非常にややこしいので図解

名称未設定.jpg

親エントリとしてAというセクションがあり
子エントリBでは親エントリを選択するエントリフィールドがある

エントリBのページを開いた時にエントリAの情報を取得したいがためであった
ページ構成としては
http://xxxx.jp/エントリA.slug/エントリBの一覧/エントリB

エントリAのページがあってそれぞれ子エントリにBがぶら下がってるケース
エントリAはカテゴリでよかったんじゃ?というのもあるが
投稿データをカテゴリとして増やしていくのはなんか違うと思ったからである

肝心のソースは?

まずエントリBの一覧をどうやって引っ張ってくるかであるが
理屈としてはエントリフィールドにエントリAが登録されているエントリBを全部取得である

簡単そうで難しい、まずエントリAのセクションを取得するところから
これはURL定義からsegmentの2番目(Indexとしては1)がslugなので単に文字列を取得することで解決
セクション moyashi をエントリA群、セクション nira をエントリB群とする

{% set parent_slug = craft.app.request.getSegment(1) %}

これをネタにエントリAを取得する

{% set parent_entry = craft.entries.section("moyashi").slug(parent_slug).one %}

エントリAを取得出来たらそれを紐づけているエントリB群を取得する
ここがリファレンス見てもよく分からず、またも中の人に泣きついて教えてもらった

relatedToを使えば出来るよ!

それ使ってみたけど出来なかったよ…
↓最初に書いた処理

{% set entriesB = craft.entries.section("nira").relatedTo("moyashi:" ~ parent_entry).all %}

そもそもrelatedToメソッドがどういうデータを取得するのかドキュメント読んでてもよく分からないのである
ちなみに↑これでも一応それっぽいデータを引っ張ってきてはいたが、
slugが違うのに微妙に似てるエントリも取ってきてしまうポンコツ記述であった
(よく分かんなかったのでSearchみたいなもんかな?ってノリで書いた)

で、たどり着いた正解がこちら

{% set entriesB = craft.entries.section("nira").relatedTo({targetElement : parent_entry}).all %}

配列でtargetElementに親エントリを指定すると良いとのことだった。うーん、難しい。
非常にありがたいことにリレーションの資料は日本語化もされている

ストレートに直訳されている部分も多いので結局どういうことなのか分からなかった

  • 返されるエレメントが、渡したエレメントとソースまたはターゲットのどちらで関連付くかを気にしない場合、elementを使用します
  • 与えられたエレメントのソースとして関連付くエレメントだけを見つけたい場合、sourceElement を使用します
  • 与えられたエレメントのターゲットとして関連付くエレメントだけを見つけたい場合、targetElement を使用します

つまりどういうことだってばよ?
本当はtargetElementも不適切なのかもしれないが
何度も検証を重ねてヨシ!!という結論に至ったので一旦良しとしているのである…

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした