2013-06-08 1 views
0

У меня есть объект, который называется Product. Продукт имеет массив ProductPicture. Вот фрагмент коды:Выполнение внутренних соединений в первой строке таблицы

/** 
* @ORM\OneToMany(targetEntity="Site\MainBundle\Entity\ProductPicture", mappedBy="product", cascade={"persist","remove"}) 
*/ 
protected $pictures; 

Так у меня есть следующая доктрина запроса DQL запрос:

$query = $em->createQueryBuilder() 
      ->select('p.id, p.name, pictures.name') 
      ->from("SiteMainBundle:Product", 'p') 
      ->innerJoin('p.category', 'c') 
      ->innerJoin('p.shop', 'shop') 
      ->innerJoin('p.pictures', 'pictures'); 

Что это делает, что он делает внутреннее соединение с каждой строкой изображений (потому что каждый продукт имеет Ману картину), и, следовательно, если я генерировать JSON из этого, он будет возвращать что-то вроде этого:

[{"id":346,"name":"11b650390dde2f3132875c2f265490040ce00d93.jpg"}, 
{"id":346,"name":"98c03f5e7896cf22143f5303f8fa54e7cb6a42d5.jpg"}, 
{"id":346,"name":"776c975ed78091fbdaaf0fceac90115258b822a0.jpg"}, 
{"id":346,"name":"b02f44ff728d0ca7b498038bfd331a364eb712a3.jpg"}, 
{"id":346,"name":"eccc317200ba6b3c01fd1815bd29ebac0b96f16a.jpg"}] 

Я только хотел, чтобы это было внутреннее объединено с первый ProductPicture в массиве, а не все и так будет генерировать что-то вроде этого:

[{"id":346,"name":"11b650390dde2f3132875c2f265490040ce00d93.jpg"}]; 

Нижняя рука, что мне не нужно все ProductPicture, мне нужно только первый.

Просто для иллюстрации цели у меня есть метод, называемый getCover в сущности продукта, который получает в массиве первый ProductPicture:

/** 
* @Accessor(getter="getCover") 
*/ 
private $cover; 
public function getCover() 
{ 
    if($this->pictures->count() > 0) { 
     return $this->pictures[0]; 
    } 
    return new ProductPicture(); 
} 

Это именно то, что я хочу, чтобы внутреннее соединение должны быть выполнены на.

ответ

0

Используйте один из ...

getQueryBuilder()-> /*...*/ ->getQuery()->getSingleResult(); 

или (не выбрасывает исключение, если нет результата) ...

getQueryBuilder()-> /*...*/ ->getQuery()->getOneOrNullResult() 

или ...

getQueryBuilder()-> /*...*/ ->getQuery()->fetchOne()->getResult(); 

или (грязный - приведет к массиву, доступ к [0], но, вероятно, что вы хотите) ...

getQueryBuilder()-> /*...*/ ->getQuery()->setMaxResults(1)->getResult();