Symfony2,Doctrine2,findBy()排序不起作用。

5

我创建了一个存储我的文章实体的代码库,并且我试图按照ID倒序获取所有值。但是,每次我都会得到按照id升序排序的值。以下是我的ArticleRepository.php

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

有什么想法吗?
5个回答

13

语法看起来不错。这应该会提供一组有序的文章。

首先,请确保在 Article Entity 中使用 @Entity 注释正确设置了正确的 Repository 类。

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

另外,如果您想使用本地助手,您只需要在控制器中调用ArticleRepositoryfindBy方法即可。

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

谢谢,问题就在这里。我的实体中没有repositoryClass()参数。谢谢。 - Lkopo
值得澄清一下这段代码的一些内容。为了创建和使用自己的查询,您必须像@Ahmed在他的代码的第一部分中所解释的那样指出关系,但是第二部分...findBy(...)不需要代码的第一部分,因为您正在调用属于Symfony/Doctrine功能的“findBy”函数。 - Richard Pérez
在最后一个例子中,;之前缺少) - iiic
@iiic 谢谢,已修复 :) - Ahmed Siouani

2

您不需要在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

为什么它比更改标准的findAll顺序更好?如果您需要在几个地方使用它怎么办? - meze
@meze 实际上,findAll 不接收任何参数。如果您查看代码(Symfony2 代码),findAll 调用 findBy(array())。 - Richard Pérez
是的,它有效,但为什么?它只是同样的方法,但是更简短。现在我有一个解释,所以我会给你点赞,因为你的解决方案也有效。 - Lkopo
如果我理解得不错的话,你现在明白原因了,但以防万一其他用户不知道。问题出在你没有将你的Article类与ArticleRepository存储库类关联起来,所以最终你实际上是在调用symfony/doctrine findall(); - Richard Pérez

1
这应该可以工作:
public function findAll()
{
    $em = $this->getEntityManager();

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

    return $query->getResult();
}

它应该可以,但是用 findBy 更短、更灵活的方式也能实现同样的功能。 - Lkopo

0

Symfony 3.3 按顺序查找的工作示例。

从您的控制器:

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

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

这应该使您的存储库非常灵活,允许在不同的方法中进行不同的排序(如果您需要以不同的方式对它们进行排序),并将所有与数据库相关的代码保持在控制器之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接