Wie implementiere ich ein mysql Datums- oder Datums- / Uhrzeitfeld korrekt in hook_schema ()?


13

Ich habe eine mymodule.install-Datei geschrieben, die eine Schemadefinition enthält, um eine Tabelle in meiner Datenbank zu erstellen. Diese Tabelle enthält zwei Datenfelder. Diese Felder werden von den Benutzern ausgefüllt, wenn sie den spezifischen Inhalt ausfüllen (Beispiel: Festlegen eines Veröffentlichungsdatums für eine Nachricht). Jetzt habe ich das Modul "Datum der Einreichung" nicht absichtlich verwendet, da diese beiden Felder aus anderen Gründen in derselben Zeile in der Datenbanktabelle stehen mussten.

Das hook_schema definiert die beiden Felder folgendermaßen:

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

Die Tabelle ist korrekt in der Datenbank angelegt, aber ich bekomme immer die folgenden Ratschläge:

Feld news_board.pubblish_date: kein Schematyp für den mysql-Typ datetime. Feld news_board.unpublish_date: kein Schematyp für den mysql-Typ datetime. news_board.pubblish_date: kein Typ für Schematyp: normal. Feld news_board.pubblish_date: kein Schematyp für type. news_board.unpublish_date: kein Typ für Schematyp: normal. Feld news_board.unpublish_date: kein Schematyp für type.

Scheint mir komisch, weil ich in der Dokumentation rot die mysql_type-Spezifikation verwende, um das datetime-Format in der mysql-Datenbank zu speichern.

Ich weiß, dass Drupal native Zeitstempel unterstützt und wenn Sie ein anderes Datumsformat speichern möchten, müssen Sie spezifische Definitionen wie mysql_type oder pgsql_type verwenden, je nachdem, welche Datenbank Sie verwenden.

In Diskussionen habe ich festgestellt, dass viele Leute im Internet die mysql_type-Definition verwendet haben. Nach allem, was ich gesehen habe, haben sie das Problem gelöst. Warum funktioniert das bei mir nicht?

Danke vielmals.

Antworten:


12

Sie sollten einen Fallback-Typ ( varchar) für den Fall angeben, dass die Datenbank nicht mysql ist.

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

Die angezeigten Nachrichten stammen jedoch aus dem Schema- Modul. Dieses Problem ist bereits als Problem # 468644 aufgezeichnet .

Die Implementierung von mysql datetime in Ihrem Schema ist in Ordnung. Sie können diese Nachrichten ignorieren. Ich würde sagen, dass diese "Hinweismeldungen" durch einen Fehler im Schema-Modul verursacht werden.


Hallo Gisle, danke für die Antwort. Ich habe gerade die von Ihnen vorgeschlagene Änderung vorgenommen und ja, sie erstellt die Tabelle in der Datenbank, aber ich habe immer noch die folgenden Hinweise: •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

Ja, ich weiß, ich habe es deaktiviert und deinstalliert, aber das Ergebnis ist das gleiche. Die Kernversion, die ich benutze, ist die 7.22. Ich möchte angeben, dass ich das Schemamodul auch installiert habe. Die genannten Hinweise erscheinen, wenn ich versuche, das Schema der Datenbank mit diesem Modul zu überprüfen. Ehrlich gesagt habe ich nicht versucht zu überprüfen, ob sie auch in einem anderen Teil der Admin-Oberfläche erscheinen. Ich frage mich auch, ob ich diese Meldungen an dieser Stelle ignorieren und mit dem Aufbau des Moduls fortfahren kann. Ich weiß nicht, ob sich dies auf die Funktionalität des Moduls auswirkt.
Marco

OK, vielen Dank für deine Zeit Gisle, du hast viel von mir gerettet!
Marco

0

Wenn Sie einen Datensatztyp verwenden müssen, der nicht in der offiziell unterstützten Typenliste enthalten ist, können Sie für jedes Datenbank-Backend einen Typ angeben.

In diesem Fall können Sie den Typparameter weglassen, aber Sie werden darauf hingewiesen, dass Ihr Schema auf Backends, für die kein Typ angegeben wurde, nicht geladen werden kann. Eine mögliche Lösung kann darin bestehen, den Typ "Text" als Fallback zu verwenden. ( 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', )

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.