2013-07-16 10 views
13

Sto provando a creare un modulo con i dati nel tipo di raccolta a seconda dell'utente che sta registrando. Sto seguendo this chapter of the Symfony cookbook.Symfony form query_buider ed entità repository

Tutto funziona correttamente quando l'opzione query_builder è una chiusura in cui ottengo i miei dati da DQL. Poiché i dati devono essere recuperati da una diversa posizione nel codice, preferirei definire la query nella classe Repository.

Ecco la funzione nel mio repository:

public function findOwnedBy($user) { 
    $query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId"); 
    $query->setParameters(array("userId"=>$user->getId())); 
    return $query->getResult(); 
} 

Questa funzione quando viene chiamato in un controller e restituire un array di articolo. Ecco un frammento del documento symfony:

$formOptions = array(
        'class' => 'Acme\DemoBundle\Entity\User', 
        'multiple' => false, 
        'expanded' => false, 
        'property' => 'fullName', 
        'query_builder' => function(EntityRepository $er) use ($user) { 
         // build a custom query, or call a method on your repository (even better!) 
        }, 
       ); 

Quando ho messo una chiamata alla mia funzione Repository nel query_builder, ottengo un errore: Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given, che posso capire perché la mia repository restituisce un array di entità, non un QueryBuilder.

Non voglio duplicare il codice e creare un nuovo QueryBuilder nel modulo. Qual è la procedura migliore per utilizzare la query dal repository? Stavo pensando di avere due funzioni nel repository, una che restituisce un array e l'altra che restituisce QueryBuilder, ma il commento in Symfony doc "o chiama un metodo sul tuo repository (ancora meglio!)" fammi pensare che c'è modo migliore per questo caso.

risposta

24

Dovrebbe essere facile. Effettuare le seguenti operazioni:

public function queryOwnedBy($user) { 

    $query = $this->createQueryBuilder('a') 
      ->from('MyBundle:Article', 'a') 
      ->innerJoin('a.owndBy', 'u') 
      ->where('u.id = :id')     
      ->setParameter('id', $user->getId()); 

    return $query; 
} 

public function findOwnedBy($user) { 
    return $this->queryOwnedBy($user) 
      ->getQuery() 
      ->getResult(); 
} 

Poi nel generatore di forma:

$formOptions = array(
    'class' => 'Acme\DemoBundle\Entity\User', 
    'multiple' => false, 
    'expanded' => false, 
    'property' => 'fullName', 
    'query_builder' => function(EntityRepository $er) use ($user) { 
     return $er->queryOwnedBy($user); 
    }, 
); 

EDIT

di Grazie per la ncatnow e unagi ho cambiato le funzioni precedenti per restituire il QueryBuilder

+0

Anche se dovrebbe essere facile e quello è stato il mio primo tentativo. Questo mi restituisce l'errore 'Argomento previsto di tipo" Doctrine \ ORM \ QueryBuilder "," array "dato'. Sembra che 'query_builder' si aspetti un oggetto QueryBuilder, qualunque sia dato direttamente o restituito da una chiusura. – Florent

+0

Modificato il post. Crea due funzioni, su cui restituisce la query e un'altra che restituisce il risultato. Nel generatore di moduli chiamare la funzione che restituisce la query. Questo dovrebbe funzionare e comunque è ASCIUTTO. Spiacente, cambierò i nomi perché non sono appropriati. – saamorim

+0

hehe, è proprio quello che ho fatto e ciò che descrivo nell'ultimo paragrafo della domanda. Vado in quel modo, il piccolo commento nel documento di Symfony lascia pensare che possa funzionare fuori dalla scatola, è confuso;) – Florent

8

Ho appena fatto una piccola correzione della risposta saamorim. Il codice funzionante sarebbe qualcosa del genere:

+0

Grazie. Ho integrato la tua risposta nel mio post e ho modificato la query in modo da essere conforme all'esempio. – saamorim

Problemi correlati