在表的第一行进行内连接

时间:2013-06-08 23:48:41

标签: php symfony doctrine-orm dql query-builder

我有一个名为Product的实体。产品有一个ProductPicture数组。 以下是代码片段:

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

所以我有以下查询doctrine 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');

这样做是因为它与每一行图片进行内连接(因为每个产品都有manu图片),因此如果我生成一个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,我只需要第一个。

为了便于说明,我在Product实体中有一个名为getCover的方法,它获取数组中的第一个ProductPicture

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

这正是我想要执行内连接的原因。

1 个答案:

答案 0 :(得分:0)

使用......

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

或(如果没有结果,则不会抛出异常)...

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

或......

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

或(脏 - 将导致数组,使用[0]访问,但可能是你想要的)...

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