Как правильно реализовать mysql поле даты или даты и времени в hook_schema ()?


13

Я написал файл mymodule.install, который содержит определение схемы для создания таблицы в моей базе данных. Эта таблица содержит два поля данных. Эти поля будут заполнены пользователями, когда они будут заполнять конкретный контент (пример: указывать дату публикации новостей). Теперь я не использовал модуль «Дата внесения» специально, потому что мне нужно, чтобы эти два поля были в одной строке таблицы базы данных по другим причинам.

Таким образом, hook_schema определяет два поля:

'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: нет типа для схемы. Тип: обычный. Поле news_board.pubblish_date: нет типа схемы для типа. news_board.unpublish_date: нет типа для схемы. Тип: обычный. Поле news_board.unpublish_date: нет типа схемы для типа.

Мне это кажется странным, потому что в документации я использовал спецификацию mysql_type для сохранения формата datetime в базе данных mysql.

Я знаю, что Drupal изначально поддерживает временные метки, и если вы хотите сохранить другой формат даты, вы должны использовать определенные определения, такие как 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 в вашей схеме в порядке. Вы можете спокойно игнорировать эти сообщения. Я бы сказал, что эти «сообщения с советами» вызваны ошибкой в ​​модуле схемы.


Привет Жизель, спасибо за ответ. Я только что сделал модификацию, которую вы предложили, и да, она создает таблицу в базе данных, но я все еще получил следующие советы: •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. Я хочу указать, что у меня также установлен модуль схемы. Упомянутые советы появляются, когда я пытаюсь проверить схему базы данных с этим модулем. Честно говоря, я не пытался проверить, если они появляются в другой части интерфейса администратора. Мне также интересно, могу ли я игнорировать эти сообщения на этом этапе и продолжать сборку модуля. Я не знаю, повлияет ли это на функциональность самого модуля.
Марко

Хорошо, большое спасибо за ваше время, Жизель, ты спас мне много!
Марко

0

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

В этом случае вы можете пропустить параметр типа, но имейте в виду, что ваша схема не сможет загружаться на серверы, для которых не указан тип. Возможным решением может быть использование типа «текст» в качестве запасного варианта. ( 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', )

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.