Frage

Ich verwende für mein Projekt nur den DBAL-Teil von Doctrine.Ich muss mich also selbst um das Mapping kümmern.Ich habe herausgefunden, dass Doctrine Datenbanktypen einem generischen PHP-Typ zuordnet, wie Sie hier lesen können [1].

Jetzt bin ich auf die Tatsache gestoßen, dass Doctrine den DB-Typ TinyInt(4) auf Boolean abbildet.Laut MySQL-Handbuch ist nur TinyInt(1) äquivalent zu Boolean [2].Da es sich bei meinem Projekt um ein Legacy-Projekt handelt, das ich gerne von MySQL auf Doctrine umstelle, muss ich bei den nativen DB-Typen bleiben.

Meine Frage ist nun, wie ich den nativen Datenbanktyp aus Doctrine herausbekomme?

Vielen Dank im Voraus für Ihre Hilfe.

Stefano

[1] http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html [2] http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html

War es hilfreich?

Lösung

Ich eröffne einen Bericht in Doctrine Emission Tracker, um herauszufinden, warum Lehre so arbeitet.Die Antwort ist einfach:

Die Länge von Tinyint sagt nichts über die Größe des Wertes, der gespeichert werden könnte.Es ist in jedem Fall 1 Byte, aber er bewirkt die Füllanschlüsse, falls Sie diese Option für Ihr Feld verwenden.

doktrine kennzeichnet seinen eigenen booleschen Typ zum MySQL Tinyint-Typ, da MySQL keinen eigenen booleschen Typ bietet.

Für weitere Informationen können Sie mehr auf dem Ticket lesen:

http://www.doctrine-project.org/jira/browse/DBAL-781

Andere Tipps

Für diejenigen, die Legacy-MySQL-Datenbanken der Doktrin zuordnen, habe ich eine Lösung für ein häufiges Problem gefunden, das beim Umgang mit TINYINT(4) leicht übersehen wird.

TL;DR

ändern default: '1' in der Feldzuordnung zu

is_active:
    type: boolean
    options:
        default: true
    nullable: true

Lange Version

Ich hatte die folgende Datenbankstruktur in der Legacy-Datenbank, bitte beachten Sie tinyint(4) In is_active Spalte

CREATE TABLE IF NOT EXISTS `foo_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
...
  `is_active` tinyint(4) DEFAULT '1',
...

nachdem Sie die folgenden Befehle ausgeführt haben

php app/console doctrine:mapping:import --force AcmeDemoBundle yml
php app/console doctrine:generate:entities AcmeDemoBundle

und dann beim Laufen php app/console doctrine:schema:update --dump-sqlAm Ende hatte ich Diff

ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;

Ich konnte keine Änderungen an der vorhandenen Datenbank vornehmen (aber selbst dadurch wurde das Problem nicht gelöst, ich bekam immer noch diesen Unterschied).

Die YML-Zuordnung hatte die folgende Felddefinition

is_active:
    type: boolean
    nullable: true
    default: '1'
    column: is_active

Ich habe es mit versucht

is_active:
    columnDefinition: "TINYINT(4)"
    nullable: true
    default: '1'
    column: is_active

ohne Erfolg, dann nach einer sehr verbreiteten Regel in der Programmierung „Wenn Sie am Code wirklich nichts falsch machen, liegt das Problem woanders.“ Ich habe die Lösung gefunden

Lösung

is_active:
    type: boolean
    options:
        default: true
    nullable: true

jetzt auch mit einfachem Einsatz type: boolean es erkennt tinyint(4) korrekt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top