Рейтинг:2

EntityQuery, где поле с несколькими значениями содержит значение

флаг de

Я программирую 15 лет, 10 лет на PHP, но это мой первый проект на Drupal. Использование Друпал 9.

Я пытаюсь получить объект (пользовательский тип контента), который имеет 2 многозначных поля объекта (пользователя). Если значение, которое у меня есть, находится в одном поле, я хочу получить другое. Проблема в том, что я не могу понять, как запросить сущность, когда скалярное значение, которое у меня есть, находится в списке. Вот что у меня есть:

вернуть \Drupal::entityQuery('узел')
  ->условие('тип', 'osj_relationships')
  ->условие('field_supervised_reps', [$userId], 'IN')
  ->выполнить();

Что генерирует этот SQL:

'ВЫБРАТЬ "base_table"."vid" КАК "vid", "base_table"."nid" КАК "nid"
ОТ
"узел" "базовая_таблица"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ "node_field_data" "node_field_data" ON "node_field_data"."nid" = "base_table"."nid"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ "node__field_supervised_reps" "node__field_supervised_reps" ON "node__field_supervised_reps"."entity_id" = "base_table"."nid"
ГДЕ ("node_field_data"."type" = 'osj_relationships') И ("node__field_supervised_reps"."field_supervised_reps_target_id" IN ('2458'))'

Вторая часть предложения WHERE ищет значение поля в моем параметре. Мне нужно, чтобы он искал мой параметр в поле. Я также пробовал CONTAINS, но это, похоже, предполагает, что значение поля является строкой, а не массивом. Если бы я мог перевернуть это предложение WHERE, это было бы идеально. т.е.

(('2458') IN "node__field_supervised_reps"."field_supervised_reps_target_id") 

Я полагаю, что мог бы использовать CONTAINS, если бы мог взорвать список полей, но это могло бы привести к ложным попаданиям.

Какие-либо предложения?

Рейтинг:2
флаг in

Вам даже не нужно использовать В здесь, только если у вас есть несколько $userIds, иначе будет работать простой оператор =:

вернуть \Drupal::entityQuery('узел')
  ->условие('тип', 'osj_relationships')
  ->условие('field_supervised_reps', $userId)
  ->выполнить();

Сгенерированный запрос будет работать так, как вы хотите. Это работает, потому что каждое значение многозначного поля хранится в отдельной строке базы данных.

Например, при наличии многозначного поля ссылки на объект field_tags, добавленного к узлам статьи, если у вас есть статья (с идентификатором = 111), ссылающаяся на два термина таксономии с идентификаторами 222 и 333, node__field_tags таблица может выглядеть так:

пучок удален entity_id id_revision_id код языка дельта field_tags_target_id
статья 0 111 777 en 0 222
статья 0 111 777 en 1 333
Ed Coakley avatar
флаг de
Спасибо за ответ. Я начал возиться с «в» и «содержит» только после того, как «=» не сработало. В дополнение к entityQuery() я также пробовал entityTypeManager(): вернуть \Drupal::entityTypeManager() ->getStorage('узел') ->загрузить по свойствам([ 'тип' => 'osj_relationships', 'field_supervised_reps' => $userId ]); ... с тем же результатом (пустой массив). Я проверил, что цель, которую я ищу, находится в базе данных, и имена полей верны. Я попробовал intval($userid), который также ничего не изменил. Любые другие предложения?
Ed Coakley avatar
флаг de
Что ж, при ближайшем рассмотрении я обнаружил проблему с орфографией, когда создавал тип контента. Как всегда, глупая машина делает то, что ей говорят. 'osj_relationships' != 'osj_relationships' Фу. Спасибо, по крайней мере, за подтверждение того, что я лаю на правильное дерево.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.