hook_schema()でmysqlの日付または日付時刻フィールドを正しく実装する方法は?


13

データベースにテーブルを作成するためのスキーマ定義を含むmymodule.installファイルを作成しました。このテーブルには2つのデータフィールドが含まれます。これらのフィールドは、ユーザーが特定のコンテンツを入力するときに入力されます(例:ニュースの公開日を指定する)。今、私は意図的にDate寄贈されたモジュールを使用しませんでした。他の理由で、これら2つのフィールドがデータベーステーブルの同じ行にある必要がありました。

hook_schemaは、次のように2つのフィールドを定義します。

'pubblish_date' => array(
    'description' => t('The pubblish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),
  'unpublish_date' => array(
    'description' => t('The unpublish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),

テーブルはデータベースに正しく作成されますが、私は常にこれらのアドバイスメッセージを受け取ります:

フィールドnews_board.pubblish_date:mysqlタイプdatetimeのスキーマタイプはありません。フィールドnews_board.unpublish_date:mysqlタイプdatetimeのスキーマタイプはありません。news_board.pubblish_date:スキーマタイプにタイプはありません:normal。フィールドnews_board.pubblish_date:typeのスキーマタイプはありません。news_board.unpublish_date:スキーマタイプにタイプはありません:normal。フィールドnews_board.unpublish_date:typeのスキーマタイプはありません。

私には奇妙に思えますが、mysqlデータベースにdatetime形式を保存するためにmysql_type仕様を使用するためにドキュメントを読みました。

Drupalはネイティブにタイムスタンプをサポートしているため、別の日付形式を保存する場合は、データベースyuoが使用しているmysql_typeやpgsql_typeなどの特定の定義を使用する必要があります。

議論の中で、多くの人がmysql_type定義を使用していて、私が見たところ、問題を解決したことがわかりました。

どうもありがとう。

回答:


12

varcharデータベースがmysqlではない場合のフォールバックタイプ()を指定する必要があります。

'pubblish_date' => array(
  'description' => t('The pubblish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),
'unpublish_date' => array(
  'description' => t('The unpublish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),

ただし、表示されるメッセージはSchemaモジュールからのものです。この問題は既に問題#468644として記録されています。

スキーマでのmysql datetimeの実装は問題ありません。これらのメッセージは無視しても問題ありません。これらの「アドバイスメッセージ」は、スキーマモジュールのバグが原因であると言えます。


こんにちはGisle、答えてくれてありがとう。私はちょうどあなたが提案の変更を行ったとはい、それはデータベースにテーブルを作成しますが、私はまだこのadivicesを得た: •Field news_board.pubblish_date: no Schema type for mysql type datetime. •Field news_board.unpublish_date: no Schema type for mysql type datetime.
マルコ

はい、知っています。無効にしてアンインストールしましたが、結果は同じです。私が使用しているコアバージョンは7.22です。スキーマモジュールもインストールされていることを指定したい。このモジュールを使用してデータベースのスキーマを検査しようとすると、前述のアドバイスが表示されます。正直なところ、管理インターフェースの他の部分でも問題がないかどうかを確認しようとしませんでした。また、この時点でこのメッセージを無視してモジュールの構築を続行できるかどうかも疑問に思っています。これがモジュール自体の機能に影響するかどうかはわかりません。
マルコ

OK、時間をくれてありがとうGisle、あなたは私の多くを救った!
マルコ

0

公式にサポートされているタイプのリストに含まれていないレコードタイプを使用する必要がある場合は、各データベースバックエンドのタイプを指定できます。

この場合、typeパラメーターは省略できますが、タイプが指定されていないバックエンドでスキーマをロードできないことに注意してください。可能な解決策は、フォールバックとして「テキスト」タイプを使用することです。(https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21database.api.php/group/schemaapi/8.2.x

'submit_date' => array( 'type' => 'varchar', 'mysql_type' => 'datet', )

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.