2015-02-22 15 views
7

Esistono tre entità: Cliente, Messaggi, Allegati.Caricamento in corso dell'entità correlata in Symfony 2

La relazione tra queste entità è semplice: un cliente può avere molti messaggi e un messaggio può avere molti allegati. Entrambe le relazioni sono "one-to-many".

Ho detto alla dottrina di essere pigra durante il caricamento dei messaggi per l'entità Cliente. Quindi $customer->getMessages() genera un'istruzione SQL aggiuntiva. Va bene.

Ma ho anche definito un caricamento "EAGER" per gli allegati per l'entità Messaggio.

Ora mi sarei aspettato che i messaggi che ottengo chiamando $customer->getMessages() siano già caricati con tutti i loro allegati. Ma $message->getAttachments() causa ancora un'istruzione SQL per messaggio.

È previsto questo comportamento?

Solo per riferimento, stralci di miei corsi:

Customer.php

class Customer 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Message", mappedBy="customer") 
    * @ORM\OrderBy({"createdOn" = "DESC"}) 
    */ 
    private $messages; 

Message.php

class Message 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Customer", inversedBy="messages") 
    * @ORM\JoinColumn(name="customer_id", referencedColumnName="id") 
    **/ 
    private $customer; 
    /** 
    * @ORM\OneToMany(targetEntity="Attachment", mappedBy="message", fetch="EAGER") 
    **/ 
    private $attachments; 

Attachment.php:

class Attachment 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Message", inversedBy="attachments") 
    * @ORM\JoinColumn(name="message_id", referencedColumnName="id") 
    **/ 
    private $message; 
+0

Penso che questo è stato realizzato prima in Dottrina 2.5. Sospetto che tu stia usando 2.4? – Cerad

+0

Sì, sto usando 2.4. Quindi dovrò aggirare quel problema per ora. – Jens

risposta

6

Suona come exp comportamento per me. La documentazione della dottrina sembra implicare che il recupero avido è solo un livello profondo.

Secondo la documentazione:

Ogni volta che si esegue una query per un ente che ha associazioni persistenti e queste associazioni sono mappati come EAGER, saranno automaticamente caricati in comune con l'entità interrogato ed è quindi immediatamente disponibili per la vostra applicazione.

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

L'entità interrogato nel tuo caso è cliente e il cliente ha desiderosi sui messaggi modo che i messaggi sono popolate. I messaggi, tuttavia, non sono oggetto interrogato, quindi gli allegati non vengono caricati.

+0

Grazie, speravo in una risposta diversa. Almeno non devo cercare un errore dove non ce n'è. – Jens

+0

Non ne sono sicuro. Quando i messaggi vengono interrogati, gli allegati hanno un solo livello di profondità. Dovrebbero davvero caricare. Dovrò abbattere 2,5 e fare un test. Ovviamente potresti stare meglio solo costruendo una query. – Cerad

+0

@Jens Cerad ha ragione che probabilmente stai molto meglio costruendo una query se hai bisogno di tutto ciò che è stato caricato. –

3

l'esempio di codice corretto potrebbe essere simile al seguente:

NOTA: prendere un messaggio con lazy carico, vale a dire ottenere messaggi con query aggiuntiva in modo proattivo; Finché i messaggi vengono recuperati dal database, gli allegati corrispondenti a ciascun messaggio verranno caricati automaticamente.

clienti

class Customer 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Message", mappedBy="customer", fetch="LAZY") 
    * @ORM\OrderBy({"createdOn" = "DESC"}) 
    */ 
    private $messages; 

Messaggio

class Message 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Customer", inversedBy="messages") 
    * @ORM\JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    /** 
    * @ORM\OneToMany(targetEntity="Attchment", mappedBy="message", fetch="EAGER") 
    */ 
    private $attachments; 

Allegato

class Attachment 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToONe(targetEntity="Message", inversedBy="attachments") 
    * @ORM\JoinColumn(name="message_id", referencedColumnName="id") 
    */ 
    private $message; 
Problemi correlati