выполнение внутренних соединений в первой строке таблицы

У меня есть объект, который называется 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 в объекте Product, который получает первый ProductPicture в массиве:

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

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


person adit    schedule 08.06.2013    source источник


Ответы (1)


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

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

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

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

or ...

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

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

getQueryBuilder()-> /*...*/ ->getQuery()->setMaxResults(1)->getResult();
person Nicolai Fröhlich    schedule 08.06.2013