2013-10-18 8 views
5

Ho creato un repository per la mia entità Articoli e sto cercando di ottenere tutti i valori ordinati per ID DESC. Ma, otterrò sempre i valori ordinati da id ASC. Qui è la mia ArticleRepository.php:Symfony2, Doctrine2, findBy() ordine non funzionante

<?php 

namespace Acme\BlogBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

class ArticleRepository extends EntityRepository 
{ 
    public function findAll() 
    { 
     return $this->findBy(array(), array('id' => 'DESC')); 
    } 

    public function findOneBySlug($slug) 
    { 
     $query = $this->getEntityManager() 
         ->createQuery(' 
          SELECT p FROM AcmePagesBundle:Article a 
          WHERE a.slug = :slug 
         ') 
         ->setParameter('slug', $slug); 

     try { 
      return $query->getSingleResult(); 
     } catch (\Doctrine\ORM\NoResultException $e) { 
      return false; 
     } 
    } 
} 

Tutte le idee?

risposta

13

La sintassi sembra buona. Questo dovrebbe fornire una serie di articoli ben ordinati.

In primo luogo, assicurarsi che l'annotazione @Entity è impostato con la classe repository destra all'interno della Articolo Entità,

/** 
* @ORM\Entity(repositoryClass="..."); 
*/ 
class Article 
{ 
    // ... 
} 

Inoltre, se si desidera utilizzare aiutanti nativi, hai appena di chiamare findBy dal ArticleRepository entro il controller,

$articles = $this->get('doctrine') 
     ->getRepository('YourBundle:Article') 
     ->findBy(array(), array('id' => 'DESC')); 
+0

Grazie v'è il problema. Non avevo il parametro 'repositoryClass()' nella mia entità. Grazie. –

+0

Vale la pena di chiarire qualcosa su questo codice. Per poter creare e utilizzare le tue query, devi indicare la relazione come @Ahmed spiegare nella prima parte del suo codice, ma la seconda parte ... findBy (...), non ha bisogno del primo parte del codice, dal momento che si chiama una funzione "findBy", che appartiene alla funzionalità Symfony/Doctrine. –

+0

nell'esempio di L3 manca ')' prima ';' – iiic

1

Questo dovrebbe essere il lavoro:

public function findAll() 
{ 
    $em = $this->getEntityManager(); 

    $query = $em->createQuery(' 
     SELECT * 
     FROM AcmePagesBundle:Article a 
     ORDER BY a.id DESC 
    '); 

    return $query->getResult(); 
} 
+0

Dovrebbe sì, ma findBy fare lo stesso con la versione più breve e più flessibile. –

3

Non è necessario creare una query in ArticleRepostory.php per quella

Nel vostro controller si può semplicemente fare:

$entities = $em->getRepository('YourBundle:Article')->findBy(array(), array('id' => 'DESC')); 

->findBy(array(), array('id' => 'DESC')); // Order Works 
->findAll(array(), array('id' => 'DESC')); // Order doesn't work 
+0

Perché è meglio che modificare l'ordine di standard 'findAll'? E se ne avessi avuto bisogno in alcuni posti? – meze

+0

@meze nella realtà findAll non riceve alcun parametro, se vedi il codice (codice symfony2) findAll chiama findBy (array()). –

+0

Sì, funziona, ma perché? È lo stesso metodo ma nella versione più corta. (ora sono a parte una spiegazione, quindi ti darò una conferma, perché anche la tua soluzione funziona) –

0

vorrei tendono a fare questo nel mio repository (per consentire l'utilizzo dello stesso DQL selezionato in diversi metodi nel repository - specialmente quando si includono molti fetch-join da includere):

class FooRepository extends EntityRepository 
{ 
    /** 
    * Get the DQL to select Foos with all joins 
    * 
    * @return string 
    */ 
    public function getSelectDql() 
    { 
     $dql = ' 
       SELECT f 
       FROM Entity:Foo f 
     '; 

     return $dql; 
    } 

    /** 
    * Fetch all foos, ordered 
    * 
    * @return array 
    */ 
    public function fetchAllOrdered() 
    { 
     $dql = sprintf(
      '%s %s', 
      $this->getSelectDql(), 
      'ORDER BY f.id DESC' 
     ); 

     return $this->getEntityManager() 
      ->createQuery($dql) 
      ->getResult(); 
    } 
} 

Ciò dovrebbe rendere il repository abbastanza flessibile, consentire diversi ordinamenti in diversi metodi (se è necessario ordinarli in modo diverso) e tenere fuori dal controller tutto il codice relativo al DB.

0

Symfony 3.3 trovare per esempio di lavoro.

dal controller:

public function indexAction(){ 
    $entityManager = $this->getDoctrine()->getManager(); 
    $categoryRepository = $entityManager->getRepository(ProductCategory::class); 
    $items = $categoryRepository->findBy(array(), array('id' => 'DESC')); 
    .... 
} 
Problemi correlati