Имена таблиц элементов коллекции полей в mysql
Я создаю функцию, которая будет условно необходима для вывода данных сущности. Тип сущности - это созданный мной пользовательский тип, который является сложным и реализует несколько вложенных коллекций полей.
Моя проблема заключается в том, что перебор сущностей с использованием Entity::loadMultiple()
очень медленный, так как каждой сущности необходимо использовать FieldCollectionItem::load()
несколько раз, чтобы получить данные, которые ей необходимо вывести. Более 1000 экземпляров сущностей это потребляет много ресурсов и занимает много времени для загрузки.
Я пытаюсь чтобы обойти это, извлеките данные с помощью SQL-запроса и объедините таблицы вместе. Я нахожусь в тупике при извлечении данных из элементов коллекции полей с длинными именами машин, поскольку данные, по-видимому, хранятся в таблицах с именами, такими как field_collection_item__5d28be6634
, в основном просто "поле_коллекция_элемент__" с добавленным к нему шестнадцатеричным хэшем из 10 символов.
Теоретически это не было бы большой проблемой, за исключением того, что, похоже, все записи для одного и того же элемента коллекции полей разделены на множество из этих таблиц без какого-либо шаблона или связи, которые я могу различить.
Как мне узнать, из каких таблиц извлекать мои данные для любого данного экземпляра родительской коллекции полей?
Редактировать: Я недавно пересмотрел это и подумал, что некоторые из этих таблиц могут быть таблицами изменений, но ни одна из них не содержит "_r_" в имени таблицы. Я все еще не могу определить, какие таблицы использовать, поскольку, похоже, существует несколько таблиц (не включая таблицы изменений) для одного элемента коллекции полей. Петляющий через объекты и загрузка вложенных коллекций полей занимают более 5 минут, что слишком долго для моих пользователей.
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
.
Снимок экрана 2: value
данные столбца из таблицы key_value
для поля field_test
.
Я знаю, что это не лучшее решение, но, если имя таблицы не имеет имени поля в если вы можете использовать данные в столбце value
в таблице key_value
, вы можете найти, какая таблица используется для какого поля.
Надеюсь, это поможет.