Я знаю, что есть много других тем по этому поводу, но я считаю, что моя странная, и я провел последний день, отлаживая ее причину, пока безуспешно, поэтому надеюсь, что кто-то, кто больше разбирается в схемах/хранилище полей, может мне помочь.
Сначала немного предыстории того, чем я занимаюсь. У меня есть набор конфигураций, который упакован с использованием модуля функций и развернут как пакет на ряде других наших сайтов. Частью этого набора функций является ряд типов каналов для импорта контента в узлы. Когда я развертываю эту функцию на 1 сайте, я получаю сообщение об ошибке «Несоответствие определений сущности и/или поля» для поля feeds_item. На другом сайте, на который я его развертываю, я не получаю никаких ошибок. Странно то, что в одном ошибка, а в другом нет.
Я проследил проблему до SqlContentEntityStorageSchema::requiresFieldStorageSchemaChanges
. В частности, происходит то, что значение $installed_schema
на сайте с ошибкой пустой массив, но есть данные на сайте без ошибки.
/**
* {@inheritdoc}
*/
общедоступная функция требуетFieldStorageSchemaChanges(FieldStorageDefinitionInterface $storage_definition, FieldStorageDefinitionInterface $original) {
$table_mapping = $this->getTableMapping($this->entityType);
если (
$storage_definition->hasCustomStorage() != $original->hasCustomStorage() ||
$storage_definition->getSchema() != $original->getSchema() ||
$storage_definition->isRevisionable() != $original->isRevisionable() ||
$table_mapping->allowsSharedTableStorage($storage_definition) != $table_mapping->allowsSharedTableStorage($original) ||
$table_mapping->requiresDedicatedTableStorage($storage_definition) != $table_mapping->requiresDedicatedTableStorage($original)
) {
вернуть ИСТИНА;
}
если ($storage_definition->hasCustomStorage()) {
// Поле имеет пользовательское хранилище, поэтому мы не знаем, возможно ли изменение схемы.
// нужно или нет, но так как по первоначальным проверкам ранее в этом
// функция, ничего не изменилось в определении, которым мы управляем, мы
// вернуть ЛОЖЬ.
вернуть ЛОЖЬ;
}
$current_schema = $this->getSchemaFromStorageDefinition($storage_definition);
$this->processFieldStorageSchema($current_schema);
$installed_schema = $this->loadFieldSchemaData($original);
$this->processFieldStorageSchema($installed_schema);
вернуть $current_schema != $installed_schema;
}
Если я проверю внутри ключ_значение
таблица с этим запросом выберите * из key_value, где коллекция, например «entity.storage_schema.sql», и имя, например «node.field_schema_data.feeds_item»;
он также пуст на 1, но не на другом:
Значит, где-то как-то не правильно установилась схема на одном сайте. Я могу исправить это, установив devel-entity-updates
модуль или написание хука обновления, который просто повторно сохраняет существующее определение хранилища поля, но я надеюсь, что у кого-то есть некоторое представление о том, Почему это происходит. Спасибо!
N.B Сайт с ошибками работает на Drupal 9.2.10
пока сайт без ошибок работает на 9.2.11
но я не уверен, что это имеет значение.
Кроме того, я должен отметить, что поля на самом деле установлены нормально и работают. Проблема заключается именно в ошибке несоответствия.