web-dev-qa-db-fra.com

Comment implémenter correctement un champ date ou datetime mysql dans hook_schema ()?

J'ai écrit un fichier mymodule.install qui contient une définition de schéma pour créer une table dans ma base de données. Ce tableau contient deux champs de données. Ces champs seront renseignés par les utilisateurs lorsqu'ils rempliront le contenu spécifique (exemple: pour spécifier une date de publication pour une actualité). Maintenant, je n'ai pas utilisé le module Date de contribution exprès, car j'avais besoin que ces deux champs se trouvent sur la même ligne dans la table de base de données pour d'autres raisons.

Le hook_schema définit les deux champs de cette façon:

'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,
  ),

La table est créée correctement dans la base de données, mais je reçois toujours ces messages de conseil:

Champ news_board.pubblish_date: aucun type de schéma pour datetime de type mysql. Champ news_board.unpublish_date: pas de type de schéma pour datetime de type mysql. news_board.pubblish_date: pas de type pour Schema type: normal. Champ news_board.pubblish_date: aucun type de schéma pour type. news_board.unpublish_date: aucun type pour Schema type: normal. Champ news_board.unpublish_date: aucun type de schéma pour type.

Cela me semble étrange car j'ai rouge sur la documentation pour utiliser la spécification mysql_type afin de stocker le format datetime dans la base de données mysql.

Je sais que Drupal prend en charge les horodatages natifs et si vous souhaitez stocker un format de date différent, vous devez utiliser des définitions spécifiques comme mysql_type ou pgsql_type selon la base de données que vous utilisez.

Dans les discussions, j'ai trouvé que beaucoup de gens en ligne utilisaient la définition mysql_type et d'après ce que j'ai vu, ils ont résolu le problème, alors pourquoi cela ne fonctionne pas pour moi?

Merci beaucoup.

13
Marco

Vous devez fournir un type de secours (varchar) dans le cas où la base de données n'est pas 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,
),

Cependant, les messages que vous voyez proviennent du module Schema . Ce problème est déjà enregistré comme problème # 468644 .

L'implémentation du datetime mysql dans votre schéma est très bien. Vous pouvez ignorer ces messages en toute sécurité. Je dirais que ces "messages de conseil" sont causés par un bogue dans le module Schéma.

12
Free Radical

Si vous devez utiliser un type d'enregistrement non inclus dans la liste des types officiellement pris en charge, vous pouvez spécifier un type pour chaque backend de base de données.

Dans ce cas, vous pouvez omettre le paramètre type, mais sachez que votre schéma ne se chargera pas sur les backends qui n'ont pas de type spécifié. Une solution possible peut être d'utiliser le type "texte" comme solution de rechange. ( 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', )

0
PADMAJA SONWANE