3

属性として配列を持つ製品エンティティがあります。

     /**
     * @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、名前など、それらの一部のみが必要でした.しかし、製品属性の1つは実際にはエンティティです(これはProductPictureです) ) では、select ステートメントでこれを返すにはどうすればよいでしょうか?

編集:

これは、画像を内部結合する方法に相当する SQL です。

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

2 に答える 2

2

このようなことを試してみてください.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')
            ;
于 2013-06-08T18:29:56.420 に答える
0

エンティティの DQL を使用してカスタム リポジトリ メソッドを追加し、コントローラーから呼び出す

私が使用しているこの例では、リポジトリメソッドに好きな名前を付けることができますfindProductWithPicture

class ProductRepository extends EntityRepository
{
    /**
     * @param integer $id
     */
    public function findProductWithPicture($id)
    {
        $dql = <<<SQL
SELECT
    p.id    id,
    p.name  name,
    q       picture
FROM
    Shopious\MainBundle\Entity\ProductPicture q,
    Shopious\MainBundle\Entity\Product p
WHERE
    p.id        = :picture_id  AND
    q.product   = p.id
SQL;

        $query = $this->_em->createQuery($dql)->setParameter('picture_id', $id);

        return $query->setMaxResults(1)->getResult();
    }
}

コントローラーから使うには

$em = $this->getDoctrine()->getManager();
$product = $em->getRepository('ShopiousMainBundle:Product')->findProductWithPicture($id);

return $this->render('ShopiousMainBundle:Product:show.html.twig', array(
    'product' => $product[0]
));

レンダリングされた Twig テンプレートでは、次のようにアクセスできます

<p>{{ product.id }}
<p>{{ product.name }}
<p>{{ product.picture.whatever_property }}
于 2013-06-08T17:11:56.493 に答える