Tipo Mapping in Dottrina 2 DBAL
-
20-12-2019 - |
Domanda
Sto usando solo la parte DBAL della dottrina per il mio progetto. Quindi devo preoccuparmi rispetto alla mappatura me stesso. Ho capito che la dottrina rimprovera i tipi di database a un tipo PHP generico come puoi leggere qui [1].
Ora ho trovato il fatto che la dottrina mappa il DB tipo Tinyint (4) a Boolean. Secondo il manuale MySQL solo Tinyint (1) è equivalente al booleano [2]. Dal momento che il mio progetto è un'eregatezza che mi piace passare da Mysqli a Dottrina, ho bisogno di attaccare i tipi di DB nativi.
La mia domanda è ora come ottengo il tipo DB nativo dalla dottrina?
Grazie in anticipo per il tuo aiuto.
stefano
[1] http:// docs .doctrine-project.org / progetti / DOTTRINE-DBAL / IT / ULTIMO / Riferimento / Tipi.html [2] http://dev.mysql.com/ DOC / REFMAN / 5.0 / IT / Numeric-Type-Overview.html
Soluzione
Io conducono un rapporto in Dottrine Problem Tracker per capire perché la dottrina funziona così.La risposta è semplice:
La lunghezza di Tinyint non dice nulla sulla dimensione del valore che potrebbe essere memorizzata.È in qualsiasi caso 1 byte, ma influisce gli zeri di riempimento nel caso in cui si utilizzi questa opzione per il tuo campo.
Dottrina mappa il proprio tipo booleano al tipo di Tinyint MySQL perché MySQL non fornisce un proprio tipo booleano.
Per maggiori informazioni puoi leggere di più sul biglietto:
Altri suggerimenti
Per coloro che mapano legacy mysql db alla dottrina che ho trovato soluzione per il problema comune che è facile da perdere quando si tratta di Tinyint (4)
tl; DR
Cambia default: '1'
in Mapping del campo su
is_active:
type: boolean
options:
default: true
nullable: true
.
Versione lunga
Ho avuto la seguente struttura DB in DB legacy, si prega di notare Tinyint (4) nella colonna is_active
CREATE TABLE IF NOT EXISTS `foo_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
`is_active` tinyint(4) DEFAULT '1',
...
.
Dopo aver eseguito i seguenti comandi
php app/console doctrine:mapping:import --force AcmeDemoBundle yml
php app/console doctrine:generate:entities AcmeDemoBundle
.
e poi durante l'esecuzione di php app/console doctrine:schema:update --dump-sql
Ho finito con diff mentre
ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;
.
Non potevo fare alcuna modifica al DB esistente (ma anche farlo non ha risolto il problema, stavo ancora ottenendo questo diff)
La mappatura YML ha avuto la seguente definizione di campo
is_active:
type: boolean
nullable: true
default: '1'
column: is_active
.
Ho provato con
is_active:
columnDefinition: "TINYINT(4)"
nullable: true
default: '1'
column: is_active
.
Senza successo, quindi seguendo la regola molto comune nella programmazione "Se davvero non è stato nulla di sbagliato con il codice, il problema è da qualche altra parte" ho trovato la soluzione
Soluzione
is_active:
type: boolean
options:
default: true
nullable: true
.
Ora, anche con l'utilizzo di semplicemente type: boolean
riconosce Tinyint (4) correttamente