2013-10-18 66 views
5

我爲我的Articles實體創建了一個存儲庫,我嘗試獲取由ID DESC排序的所有值。但是,我會每次獲取id ASC訂購的值。這裏是我的ArticleRepository.phpSymfony2,Doctrine2,findBy()命令不起作用

<?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; 
     } 
    } 
} 

任何想法?

回答

13

語法看起來不錯。這應該提供一組有序的文章。

首先,確保@Entity註釋設置與第實體內右側庫類,

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

另外,如果你想使用原生的助手,你剛剛打電話從findByArticleRepository控制器內,

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

由於存在這個問題。我的實體中沒有'repositoryClass()'參數。謝謝。 –

+0

值得澄清一些關於此代碼的內容。爲了您可以創建和使用您自己的查詢,您必須指出像@Ahmed在其代碼的第一部分中解釋的關係,但第二部分... findBy(...)不需要第一部分部分代碼,因爲您正在調用屬於Symfony/Doctrine功能的函數「findBy」。 –

+0

在lase的例子中,''''''之前''''' – iiic

1

這應該是工作:

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

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

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

它應該是的,但是findBy在更短和更靈活的版本中做同樣的事情。 –

3

你不需要在ArticleRepostory.php創建一個查詢爲

在你的控制器,你可以這樣做:

$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

爲什麼比改變標準findAll的順序更好?如果你在幾個地方需要它呢? – meze

+0

@meze在現實中findAll不會收到任何參數,如果看到代碼(symfony2代碼)findAll調用findBy(array())。 –

+0

是的,但爲什麼?這只是相同的方法,但在較短的版本。 (現在我是上帝一個解釋,所以我會給你upvote,因爲你的解決方案也可以) –

0

我會傾向於做這在我存儲庫(以允許在存儲庫中的不同方法中使用相同的選擇DQL - 尤其是當您需要包含許多取指連接時):

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(); 
    } 
} 

這應該使您的存儲庫非常靈活,允許使用不同方法進行不同排序(如果您需要以不同方式排序),並將所有與數據庫相關的代碼保存在控制器外。

0

Symfony 3.3按順序查找工作示例。

從你的控制器:

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