小编典典

如何从学说查询生成器中获取部分结果

sql

我有一个产品实体,其中具有一个数组作为属性:

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

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

现在在我的查询生成器中,我有以下代码:

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

这里的问题是我不想选择所有p的属性。因此,我只想在pictures数组中获得第一个ProductPicture(在我上面的例子中,它类似于getCover()方法)。我该怎么做呢?

到目前为止,我可以通过执行以下操作来过滤掉我想要的部分属性:

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

因此,在上面的示例中,我对图片进行了内部连接,但是如何从此处获取第一个元素?

总之,我的问题是如何使用查询生成器选择/查询图片数组中的第一个ProductPicture?因为当我这样做时:

$ query = $ em-> createQueryBuilder()-> select(’p’)

它返回整个产品属性,但我不希望整个产品属性。我只想要其中的一些属性,例如id,name等。但是,其中一个产品属性实际上是一个实体(即ProductPicture),那么如何在select语句中返回呢?

编辑:

这是一个等效于图片的SQL等效SQL:

SELECT * 
FROM  `product` 
JOIN  `product_picture` ON  `product`.id =  `product_picture`.product_id
WHERE  `product`.id =100
LIMIT 1

阅读 249

收藏
2021-03-23

共1个答案

小编典典

尝试这样的操作,如果它是一对多的,则正常的mySQL行为是返回带有冗余产品数据的多条记录,如果在这种情况下发生相同的情况,那么仅返回第一条记录就可以解决问题。

PS假设ProductPicture实体具有您要获取的url属性

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