Имена таблиц элементов коллекции полей в mysql


Я создаю функцию, которая будет условно необходима для вывода данных сущности. Тип сущности - это созданный мной пользовательский тип, который является сложным и реализует несколько вложенных коллекций полей.

Моя проблема заключается в том, что перебор сущностей с использованием Entity::loadMultiple() очень медленный, так как каждой сущности необходимо использовать FieldCollectionItem::load() несколько раз, чтобы получить данные, которые ей необходимо вывести. Более 1000 экземпляров сущностей это потребляет много ресурсов и занимает много времени для загрузки.

Я пытаюсь чтобы обойти это, извлеките данные с помощью SQL-запроса и объедините таблицы вместе. Я нахожусь в тупике при извлечении данных из элементов коллекции полей с длинными именами машин, поскольку данные, по-видимому, хранятся в таблицах с именами, такими как field_collection_item__5d28be6634, в основном просто "поле_коллекция_элемент__" с добавленным к нему шестнадцатеричным хэшем из 10 символов.

Теоретически это не было бы большой проблемой, за исключением того, что, похоже, все записи для одного и того же элемента коллекции полей разделены на множество из этих таблиц без какого-либо шаблона или связи, которые я могу различить.

Как мне узнать, из каких таблиц извлекать мои данные для любого данного экземпляра родительской коллекции полей?

Редактировать: Я недавно пересмотрел это и подумал, что некоторые из этих таблиц могут быть таблицами изменений, но ни одна из них не содержит "_r_" в имени таблицы. Я все еще не могу определить, какие таблицы использовать, поскольку, похоже, существует несколько таблиц (не включая таблицы изменений) для одного элемента коллекции полей. Петляющий через объекты и загрузка вложенных коллекций полей занимают более 5 минут, что слишком долго для моих пользователей.

Author: saramm1, 2016-10-27

1 answers

В Drupal 8 таблицы полей создаются как [ENTITY_TYPE]__[FIELD_NAME] и [ENTITY_TYPE]_revision__[FIELD_NAME] в базе данных. [ENTITY_TYPE]__[FIELD_NAME] - это основная таблица полей, в которой хранятся последние данные редакции поля сущности. Где as [ENTITY_TYPE]_revision__[FIELD_NAME] - таблица изменений полей, в которой хранятся все данные изменений для поля.

В вашем случае я думаю, что в вашей базе данных Drupal/есть какая-то проблема, из-за которой имя таблицы содержит случайный символ (10 символов) в шестнадцатеричном формате. Я не уверен в точной причине этого, но я тоже замечал это когда-нибудь на моем сайте Drupal (только дважды один в D7 и один в D8) не каждый раз.

В таком случае, если вы не уверены, какая таблица используется для какого поля, вы можете использовать name и value колонка в key_value таблица для получения сопоставления таблиц полей. Столбец name содержит имя сущности и поля, а столбец value содержит сериализованный массив схемы полей, хранящийся в типе большого двоичного объекта. Формат столбца name выглядит следующим образом ниже:

[ENTITY_TYPE].field_schema_data.[FIELD_NAME]

Поэтому, если у меня есть поле с именем field_test в сущности field_collection_item, то сопоставление будет сохранено как field_collection_item.field_schema_data.field_test в таблице key_value. Проверьте скриншот ниже:

Снимок экрана 1: key_value таблица, показывающая запись поля field_test. key_value table

Снимок экрана 2: value данные столбца из таблицы key_value для поля field_test. value column data from key_value table

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

Надеюсь, это поможет.

 3
Author: Yogesh, 2016-11-25 10:31:24