Рейтинг:0

программно получить дочерние узлы, ссылающиеся на родителя по ссылке на объект uuid, используя loadByProperties и entityTypeManager или другим способом без представлений

флаг cn

Я попробовал этот ответ:

https://drupal.stackexchange.com/a/298084/1082

Но я не могу использовать

'field_scientists' => $entity_reference_uuid

где в моем случае field_scientists представляет собой поле типа UUID ссылки на сущность, которое является типом поля, предоставляемым https://www.drupal.org/project/entity_reference_uuid модуль

Что происходит для меня, так это то, что я ничего не получаю, мой массив результатов из этого примера пуст.

Я хочу сделать это программно в своем собственном модуле, а не использовать Drupal View.

Если есть другой способ, например. который использует ->запрос метод запроса базы данных. Я был бы рад использовать этот программный подход.

Спасибо.

Обновлять

Пример UUID из узел в моем случае BMSSYS0000051988.

Это было установлено при импорте миграции из поля в CSV.

Мои попытки:

1. на основе примера в другом вопросе: https://drupal.stackexchange.com/a/298084/1082

  $nodes = \Drupal::entityTypeManager()->getStorage('узел')->loadByProperties([
    'тип' => 'бол',
    'field_parent_uuid' => $taxonkey,
  ]);

2. запрос БД

$query = \Drupal::entityQuery('узел')
->условие('статус', NODE_PUBLISHED)
->условие('тип', 'бол');
$and = $query->andConditionGroup();
$and->условие('field_parent_uuid', $taxonkey);
$запрос->условие($и);
$результат = $запрос->выполнить();

куда $ таксонки является BMSSYS0000051988

обе попытки 1 и 2 выше возвращают пустой массив.

Обновление 2

вот моя конфигурация миграции, которая показывает, что uuid записывается из поля в csv. Это законно? Должен ли код разработчика изменять значение uuid или uuid должен обрабатываться только ядром Drupal?

зависимости: { }
идентификатор: bol_csv_import
класс: ноль
field_plugin_method: ноль
cck_plugin_method: ноль
migration_tags: ноль
миграция_группа: по умолчанию: общедоступные
label: 'Импорт данных о видах бол'
источник:
  плагин: csv
  путь: ./data/taxonomy_species_with_unpacked_bold.csv
  разделитель: ','
  вложение: '"'
  header_offset: 0
  идентификаторы:
    - уид
  поля:
    -
      имя: uuidl: publicbins
      метка: 'Идентификатор NBN'
    -
      имя: parent_uuid
      label: 'NBN идентификатор родителя'
    -
      имя: имя
      этикетка: Имя
    -
      имя: ранг
      этикетка: «Таксономический ранг»
    -
      имя: таксон_ключ
      этикетка: «Ключ таксона»
    -
      Название: авторитет
      этикетка: авторитет
    -
      Название: SampleRecords
      лейбл: samplerecords
    -
      Название: пабликрекордс
      лейбл: publicrecords
    -
      имя: пабликбинс
      метка: паблики
    -
      Название: таксид
      метка: 'Идентификатор таксона NBN'
процесс:
  название: имя
  ИД:
    плагин: default_value
    значение_по умолчанию: 1
  uuid: uuid
  field_parent_uuid: parent_uuid
  field_taxon_key: таксон_ключ
  field_authority: полномочия
  field_rank: ранг
  field_num_bold_barcode_specimens: образцы записей
  field_num_bold_public_records: общедоступные записи
  field_num_bold_public_bins: общедоступные ящики
  field_bold_taxon_id: таксид
  тип:
    плагин: default_value
    default_value: бол
пункт назначения:
  плагин: 'сущность: узел'
миграция_зависимости: ноль

Обновление 3

Я напишу запрос к БД, чтобы решить эту проблему. Запуск командной строки sql указывает, что этот подход может работать:

MariaDB [db]> выберите * из узла, где nid = 246;
+-----+------+-------+----+---------- +
| нид | видео | тип | UUID | код языка |
+-----+------+-------+----+---------- +
| 246 | 248 | бол | NBNORG0000041189 | en |
+-----+------+-------+----+---------- +
1 ряд в сете (0,001 сек)
4uk4 avatar
флаг cn
`BMSSYS0000051988` не является [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier).
флаг cn
+1 Спасибо, @4uk4, это может быть полезно, `uuid` был установлен как этот при миграции. Когда я делаю `$node->uuid();`, я получаю ответ `BMSSYS0000051988`. Знаете ли вы, должен ли `uuid` быть установлен собственным кодом разработчика, или он должен быть установлен только самим Drupal Core?
флаг cn
Я добавил свою конфигурацию миграции к своему вопросу, чтобы показать, как был записан uuid с помощью `BMSSYS0000051988`. Если это «незаконно» в том смысле, что только ядро ​​Drupal должно управлять и создавать/записывать `uuid`ы, то это будет способствовать моей стратегии б) реализовать обходной путь, чтобы избежать использования uuid таким образом: https://drupal.stackexchange .com/questions/310697/programmatically-get-child-nodes-reference-parent-by-entity-reference-uuid-us?noredirect=1#comment395034_310699
4uk4 avatar
флаг cn
Нет, это не означает, что только ядро ​​Drupal должно управлять UUID. Одним из основных преимуществ является то, что UUID уникальны во всем мире, поэтому вы можете переносить их с сайта на сайт, и они останутся уникальными. Но я бы не стал использовать поле UUID для других данных, кроме UUID. Поместите значение, отличное от UUID, в отдельное поле и используйте UUID для перекрестных ссылок на элементы данных в источнике и/или месте назначения миграции. Где вы создаете UUID, не имеет значения.
флаг cn
+1 согласен. Я бы предпочел, чтобы миграция не импортировала данные этого поля в `uuid`, а вместо этого в другое обычное поле.Однако мне нужно работать с тем, что у меня есть, поэтому в моем «Обновлении 3» я напишу запрос к БД.
Рейтинг:0
флаг cn

Теоретически это должно работать, тип поля устанавливает UUID в качестве основного свойства: EntityReferenceUuidItem:: mainPropertyName()

Возможно, Drupal запутался и обрабатывает поле как стандартное поле ссылки на объект, потому что оно расширяет основной тип поля.

Чтобы уточнить, какое свойство поля вы запрашиваете, добавьте к нему точку:

'field_scientists.target_uuid' => $entity_reference_uuid

Что должно работать как для loadByProperties, так и для запроса объекта:

->условие('field_scientists.target_uuid', $entity_reference_uuid)

Первый — это всего лишь ярлык для второго, использующий тот же механизм запросов.

флаг cn
Я попробую это сегодня утром и вернусь к вам - пока спасибо.
флаг cn
Не повезло, боюсь. Массив вернулся еще пустым.
флаг cn
Основываясь на том, что подход с условием сводится к тому же механизму запросов, я был бы склонен не пробовать и это, ожидая той же проблемы, вместо этого делать 2 вещи: а) вызвать ошибку на https://www.drupal.org/project/entity_reference_uuid и б) реализовать обходной путь, создать новое поле в моем типе контента, которое представляет собой обычную старую ссылку на объект (не с uuid), заполнить ссылкой на узел и снова протестировать код. Если работает, напишите скрипт для заполнения остальных узлов (хотя их 100К). При заполнении будет использоваться существующее значение поля uuid ссылки на объект, чтобы найти узел для нового поля.
4uk4 avatar
флаг cn
Есть ли способ воспроизвести проблему при новой установке? Я не мог. Для меня это работает с добавленным именем свойства и без него.
4uk4 avatar
флаг cn
б) в качестве обходного пути я бы не стал генерировать дополнительные данные. Вместо этого я бы написал низкоуровневый SQL. Это также хорошая проверка того, действительно ли существует UUID, который вы запрашиваете. Низкий уровень — это простой запрос к одной таблице.
флаг cn
Отмечено спасибо @4uk4 . Моя установка кажется странной. Глядя на поле uuid ссылки на объект в узле, это строка, значение которой взято из поля, импортированного из CSV. В режиме редактирования это поле отображается как заголовок родительского узла с идентификатором узла в скобках. На данный момент я озадачен тем, как это строковое значение может ссылаться на родительский узел. Глядя на модуль UUID ссылки на сущность, я не нашел ни конфигурации, ни поля, которое дает подсказку. Я не знаю, какое поле обозначено как UUID. Некоторые недостающие части головоломки для меня.
флаг cn
Я думаю, мне нужно решить, как получить uuid узла, чтобы помочь мне понять.
4uk4 avatar
флаг cn
`$uuid = $node->uuid();`
флаг cn
+1 спасибо, да, @4uk4 и пример `uuid` в моем случае для этого `BMSSYS0000051988`. Я также обновил свой вопрос, добавив более подробную информацию о том, что я пытаюсь сделать. Спасибо за твою помощь.
флаг cn
похоже, это моя путаница между значением данных в обычном поле и uuid. так что ваш ответ действителен, и я согласен, что он должен работать. Я напишу дополнительную информацию позже.

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

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