나는 Doctrine의 문서를 읽고 있었지만 findAll () 결과를 정렬하는 방법을 찾지 못했습니다.
나는 symfony2 + doctrine을 사용하고 있습니다. 이것은 컨트롤러 내부에서 사용하고있는 진술입니다.
$this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll();
하지만 결과가 오름차순 사용자 이름으로 정렬되기를 원합니다.
이 방법으로 배열을 인수로 전달하려고했습니다.
findAll( array('username' => 'ASC') );
그러나 그것은 작동하지 않습니다 (그것도 불평하지 않습니다).
DQL 쿼리를 작성하지 않고이를 수행 할 수있는 방법이 있습니까?
답변
@Lighthart와 같이 컨트롤러에 상당한 지방을 추가하고 건조하지는 않지만 가능합니다.
엔터티 저장소에서 자신의 쿼리를 정의해야합니다. 간단하고 모범 사례입니다.
use Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository
{
public function findAll()
{
return $this->findBy(array(), array('username' => 'ASC'));
}
}
그런 다음 저장소에서 쿼리를 찾도록 엔티티에 지시해야합니다.
/**
* @ORM\Table(name="User")
* @ORM\Entity(repositoryClass="Acme\UserBundle\Entity\Repository\UserRepository")
*/
class User
{
...
}
마지막으로 컨트롤러에서 :
$this->getDoctrine()->getRepository('AcmeBundle:User')->findAll();
답변
$this->getDoctrine()->getRepository('MyBundle:MyTable')->findBy([], ['username' => 'ASC']);
답변
단순한:
$this->getDoctrine()->getRepository('AcmeBundle:User')->findBy(
array(),
array('username' => 'ASC')
);
답변
때때로 소스 코드를 보는 것이 유용합니다.
예를 들어 findAll
구현은 매우 간단합니다 ( vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php
).
public function findAll()
{
return $this->findBy(array());
}
그래서 우리는 findBy
우리에게 필요한 것을보고 찾습니다. ( orderBy
)
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
답변
이것은 나를 위해 작동합니다.
$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(),array('name' => 'ASC'));
첫 번째 배열을 비워두면 모든 데이터를 가져 오지만 제 경우에는 작동했습니다.
답변
Doctrine API 소스 코드를 살펴보십시오.
class EntityRepository{
...
public function findAll(){
return $this->findBy(array());
}
...
}
답변
다음과 같은 기준을 사용해야합니다.
<?php
namespace Bundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Collections\Criteria;
/**
* Thing controller
*/
class ThingController extends Controller
{
public function thingsAction(Request $request, $id)
{
$ids=explode(',',$id);
$criteria = new Criteria(null, <<DQL ordering expression>>, null, null );
$rep = $this->getDoctrine()->getManager()->getRepository('Bundle:Thing');
$things = $rep->matching($criteria);
return $this->render('Bundle:Thing:things.html.twig', [
'entities' => $things,
]);
}
}