0

Product というエンティティがあります。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');

これが行うことは、画像のすべての行で内部結合を行うことです (各製品には 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、最初のものだけが必要だということです。

説明のために、配列getCoverの最初のものを取得する Product エンティティで呼び出されるメソッドがあります。ProductPicture

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

これはまさに、内部結合を実行したいものです。

4

1 に答える 1

0

...のいずれかを使用します。

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

または (結果がない場合は例外をスローしません) ...

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

また ...

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

または(ダーティ - 配列になり、[0]でアクセスしますが、おそらくあなたが望むものです)...

getQueryBuilder()-> /*...*/ ->getQuery()->setMaxResults(1)->getResult();
于 2013-06-08T23:55:26.900 に答える