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

È stato utile?

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:

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top