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


13

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 à dessein, 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.

Réponses:


12

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 Schéma . Ce problème est déjà enregistré sous le numéro 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.


Salut Gisle, merci pour la réponse. Je viens de faire la modification que vous avez suggérée et oui, cela crée la table dans la base de données mais j'ai quand même eu ces conseils: •Field news_board.pubblish_date: no Schema type for mysql type datetime. •Field news_board.unpublish_date: no Schema type for mysql type datetime.
Marco

Oui je sais, je l'ai désactivé et désinstallé mais le résultat est le même. La version principale que j'utilise est la 7.22. Je veux spécifier que le module de schéma est également installé. Les conseils mentionnés apparaissent lorsque j'essaie d'inspecter le schéma de la base de données avec ce module. Honnêtement, je n'ai pas essayé de vérifier s'ils apparaissent également dans une autre partie de l'interface d'administration. Je me demande également si je peux ignorer ces messages à ce stade et continuer à construire le module. Je ne sais pas si cela affectera la fonctionnalité du module lui-même.
Marco

OK, merci beaucoup pour ton temps Gisle, tu m'as sauvé beaucoup!
Marco

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.