web-dev-qa-db-ja.com

「drush entity-updates」が失敗したときに「Mismatched entity and / or field definition」を修復する方法

Drupal 8でサイトを開発しています。8.5.0-beta1に更新した後、ステータスページにこのエラーが表示されていました(ただし、 8.4.4以前):

ENTITY/FIELD DEFINITIONS
Mismatched entity and/or field definitions
The following changes were detected in the entity type and field definitions.
Custom menu link
The menu_link_content.field_most_common_name field needs to be updated.

Mismatched entity and/or field definitions

このエラーは、数か月前にインストールした メニュー項目エクストラモジュール が原因である可能性がありますが、削除されました。

一般的なアドバイスに従って、私はdrush entity-updatesを実行しました。それは問題を解決しませんでした。私のCMDウィンドウからの出力(手動で入力)は以下のとおりです。

menu_link_content entity type :
  The menu_link_content.field_most_common_name field needs to be updated.
Do you wish to run all pending updates? (y/n): y
Drupal\Core\Entity\EntityStorageException: Exception thrown while
performing a schema update. SQLSTATE[42522]: column not found: 1054 unknown
column   [error]
'field_most_common_name_argument' in 'where clause': SELECT 1 AS expression
FROM
{menu_link_content__field_most_common_name} t
WHERE (field_most_common_name_target_id IS NOT NULL) OR
(field_most_common_name_display_id IS NOT NULL) OR
(field_most_common_name_argument IS NOT NULL) OR
(field_most_common_name_title IS NOT NULL) OR
(field_most_common_name_data IS NOT NULL)
LIMIT 1 OFFSET 0; Array
(
)
 in Drupal\Core\Entity\Sql\SqlContentEntityStorage->wrapSchemaException()
(line 1535 of C:\Users\Nick\Sites\devdesktop\drupal\core\lib\Drupal
\Core\Entity\Sql\SqlContentEntityStorage.php).
Failed: Drupal\core\EntityStorageException: !message in
Drupal\Core\Entity\Sql\SqlContentEntityStorage->wrapSchemaException()
(line 1535 of
C:\Users\Nick\Sites\devdesktop\drupal\core\lib\Drupal\Core\Entity
\Sql\SqlContentEntityStorage.php).   [error]
Cache rebuild complete.   [ok]
Finished performing updates.   [ok]

2番目の回答 here および this reference に基づいて、database_fix.moduleファイルに次の内容を含む「データベース修正」と呼ばれるカスタムモジュールを作成しました。私はコーダーではないので、ここには推測がたくさんあります。

<?php

/**
 * Fix database by updating menu_link_content.field_most_common_name field
 *
 */
function database_fix_update_8501() {
    $manager = \Drupal::entityDefinitionUpdateManager();
    if ($field = $manager->getFieldStorageDefinition('field_most_common_name', 'menu_link_content')) {
      $manager->updateFieldStorageDefinition($field);
    }
}

モジュールを有効にし、ページを更新してupdate.phpを実行しましたが、機能しませんでした。

3
Nick Hope

この質問はかなり古く、Drupal 8には関係ありません。drushにはエンティティの更新がないためですが、ステータスレポートにエンティティの更新待ちのメッセージが表示されたまま、このページが表示されると思います。 。同じシナリオに出くわし、その問題に対処したいと思いました。

メッセージは、エンティティー内のフィールドを削除または追加したために、データベース内のエンティティーの定義がファイル内のエンティティーの定義と異なる場合に表示されます。これは、モジュールを開発しているときに頻繁に発生し、エンティティ定義が進化し続けるものです。

モジュールをアンインストールしてインストールすると、エンティティを再作成するため、問題が解決します。

私はこれと同じ問題に遭遇し、モジュールのアンインストールとインストールを続けることができなかったので、この問題の一番下に到達するべきだと思いました。

Drushは、エンティティ定義をオンザフライで更新できる機能としてエンティティ更新を使用していました。ただし、これは8.7.0でDrupalコアから削除されました( コアから削除されたエンティティ更新のサポート

回避策は Devel Entity Updates モジュールをインストールし、代替のdentupを実行することです

Composerを使用している場合

composer require --dev drupal/devel_entity_updates

drush en devel_entity_updates

drush dentup

これでこの問題に対処できます。開発エンティティ更新モジュールは、開発環境でのみ使用され、より高い環境ではhook_updatesを介してエンティティに変更をプッシュすることが期待されます

2
anoopjohn