2012-09-19 4 views
8

Ho un piccolo problema con il metodo Doctrine modello hydrate(). Uso questo metodo per idratare un oggetto di modello conrete da un dato array in questo modo:Doctrine 1.2 hydrate method - array to model object

$model = new Doctrine\Model\Model; 
$model->hydrate($model_array); 

tutto funziona perfetto quando idratante oggetti semplici withou sottomodelli nidificate. Ora il problema è che ho bisogno di idratare (usando questo metodo) un oggetto che ha oggetti nidificati (e alcuni di essi hanno anche oggetti nidificati).

Se si stesse utilizzando HYDRATE_RECORD, ciò andrebbe bene, ma tutti i record della query verrebbero restituiti come oggetti, il che significa maggiore consumo di memoria. Pertanto sto usando HYDRATE_ARRAY e su richiesta idrato quella matrice concreta a un oggetto.

Supponiamo di avere un modello A che ha modelli annidati AB, AC (da uno a molti), AD e AC ha un altro modello ACE annidato. Dopo print_r dell'array A abbiamo potuto vedere questa struttura:

A Array (
    ... 
    ab Array (...) 
    ac Array (
     AC Array (
      ... 
      ace Array (...) 
     ) 
     AC Array (
      ... 
      ace Array (...) 
     ) 
     ... 
    ) 
    ad Array (...) 
) 

Normalmente dopo usando idrato presumo che questo sarebbe il mio oggetto:

A Object { 
    ... 
    ab Object { ... } 
    ac Array (
     AC Object { 
      ... 
      ace Object { ... } 
     } 
     AC Object { 
      ... 
      ace Object { ... } 
     } 
     ... 
    ) 
    ad Object { ... } 
} 

Ma invece di questo ho questa struttura:

A Object { 
    ... 
    ab Array (...) 
    ac Array (
     AC Array (
      ... 
      ace Array (...) 
     ) 
     AC Array (
      ... 
      ace Array (...) 
     ) 
     ... 
    ) 
    ad Array (...) 
} 

Quindi solo il modello principale è stato convertito in un oggetto. Sai come ottenere che tutti gli array di modelli annidati siano convertiti in oggetti come il risultato presunto?

E no, non è possibile utilizzare HYDRATE_RECORD durante l'interrogazione del DB.

+0

@ j0k perché non dovrei ringraziare per la risposta? – shadyyx

+3

Politica del sito, nessuna limitazione, grazie, quel genere di cose nella domanda reale - in quanto non fa parte della domanda. Bene nei commenti – Orbling

+2

Vedere [questo thread] (http://meta.stackexchange.com/q/2950/182741). – j0k

risposta

1

Consultare la documentazione se incappato su this.

Hai dato una prova a fromArray anziché hydrate?

+0

Non ho provato quello 'fromArray()'. Comunque non sto lavorando su quel progetto da qualche mese, ho dovuto usare il pigro-caricamento che stavo cercando di evitare ... Se dovessi apportare alcune modifiche a quel progetto, farei un tentativo. Accetterà la tua risposta per ora in quanto sembra promettente! – shadyyx

0

Cercando di rispondere a questo al meglio della mia conoscenza di Dottrina, che non è molto perché non ho mai trattato direttamente con l'idratazione.

Il problema con l'utilizzo di un array come metodo di idratazione è che in pratica si perdono tutti i metadati collegati alla query originale, soprattutto i nomi delle tabelle.

Una soluzione potrebbe essere quella di scrivere il proprio metodo di idratazione che converte la matrice in oggetti.