Symfony2在控制器中按DESC排序

diz*_*zyd 1 sql-order-by symfony

我似乎无法弄清楚如何在控制器代码中按DESC排序。我有一个类别实体,该类别实体具有一个OneToMany与Post实体。

我正在尝试按DESC对category-> getPosts的结果进行排序,它按ASC自动进行排序。

我尝试了自定义存储库,但是我需要按类别存储,使用以下存储库可以获取所有帖子,而不是特定于该类别的帖子。

我知道这很简单,我完全想不到。如何使用当前设置添加订单?

这个查询对我有用:

public function getBlogsByCategory($category)
{
    return $this->createQueryBuilder('post')
        ->leftJoin('post.category','category')
        ->andWhere('category.title = :category')
        ->setParameter('category', $category)
        ->orderBy('post.createdAt', 'DESC')
        ->getQuery()
        ->getResult();
}
Run Code Online (Sandbox Code Playgroud)

控制者

public function showAction($category = null)
{
    $em = $this->getDoctrine()->getManager();

    $category = $em->getRepository('AcmeDemoBundle:Category')
        ->findOneByTitle($category);

    if (!$category) {
        throw $this->createNotFoundException('Unable to find blog posts');
    }

    $posts = $category->getPosts();


    return array(
        'posts'    => $posts,
        'category' => $category
    );
}
Run Code Online (Sandbox Code Playgroud)

类别实体

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

/**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=255)
 */
private $title;

/**
 * @var string
 *
 * @Gedmo\Slug(fields={"title"}, unique=false)
 * @ORM\Column(length=255)
 */
private $slug;

/**
 * @ORM\OneToMany(targetEntity="Post", mappedBy="category")
 */
protected $posts;


public function __construct()
{
    $this->posts = new ArrayCollection();
}

public function __toString()
{
    return $this->getTitle() ? $this->getTitle() :  "";
}

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * Set title
 *
 * @param string $title
 * @return Category
 */
public function setTitle($title)
{
    $this->title = $title;

    return $this;
}

/**
 * Get title
 *
 * @return string
 */
public function getTitle()
{
    return $this->title;
}

/**
 * Set slug
 *
 * @param string $slug
 * @return Category
 */
public function setSlug($slug)
{
    $this->slug = $slug;

    return $this;
}

/**
 * Get slug
 *
 * @return string
 */
public function getSlug()
{
    return $this->slug;
}

/**
 * Add posts
 *
 * @param Post $posts
 * @return Category
 */
public function addPost(Post $posts)
{
    $this->posts[] = $posts;

    return $this;
}

/**
 * Remove posts
 *
 * @param Post $posts
 */
public function removePost(Post $posts)
{
    $this->posts->removeElement($posts);
}

/**
 * Get posts
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getPosts()
{
    return $this->posts;
}
Run Code Online (Sandbox Code Playgroud)

邮政实体

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="posts")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

/**
 * Set category
 *
 * @param \Acme\DemoBundle\Entity\Category $category
 * @return Post
 */
public function setCategory(\Acme\DemoBundle\Entity\Category $category = null)
{
    $this->category = $category;

    return $this;
}

/**
 * Get category
 *
 * @return \Acme\DemoBundle\Entity\Category 
 */
public function getCategory()
{
    return $this->category;
}
Run Code Online (Sandbox Code Playgroud)

回购后

public function getPosts()
{
    $qb = $this->createQueryBuilder('p')
        ->addOrderBy('p.createdAt', 'DESC');

    return $qb->getQuery()
        ->getResult();
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ski 5

编辑

由于您已经在使用自定义存储库,因此您将必须修改存储库方法以使其看起来像:

public function getOrderedPostsByCategory($categoryId)
{
    return $this->createQueryBuilder('p')
        ->leftJoin('p.Category','c')
        ->addWhere('c.id = :categoryId')
        ->setParameter('c.categoryId', $categoryId)
        ->orderBy('p.createdAt', 'DESC')
        ->getQuery()
        ->getResult();

}
Run Code Online (Sandbox Code Playgroud)

或第二种选择是修改您getPosts的实体方法并在内存中对数组进行排序return $this->posts;