0

Doctrine2 を使用して PHP アプリケーションを Zend Framework に移植しようとしています。ウェブショッププラットフォームです。ユーザーのショッピングカートにある製品からアクセサリを選択するには、追加の条件を指定して DQL クエリを作成する必要があります。

私は伝統的なクエリを持っています:

SELECT 
    ... 
FROM 
    product 
INNER JOIN 
    accessory_to_product ON(product.productid = accessory_to_product.accessoryid AND accessory_to_product.productid IN(000,000,000))

しかし、これはDoctrineでなければなりません。次のエンティティがあります。

<?php

/**
 * @ORM\Table(name="product")
 * @ORM\Entity(repositoryClass="BestBuy\Entity\Repository\ProductRepository")
 */
class Product extends \BasicEntity
{

    /**
     * 
     * @var integer
     * @ORM\Column(type="integer",nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $productid;

    /**
     *
     * @var string
     * @ORM\Column(type="string",nullable=false)     
     */
    protected $title;

    /**
     *
     * @var string
     * @ORM\Column(type="text",nullable=false)   
     */
    protected $description;

    /**
     *
     * @var string
     * @ORM\Column(type="datetime",nullable=false)   
     */
    protected $insertdate;

    //....

    /**
     *
     * @var array
     * 
     * @ORM\ManyToMany(targetEntity="Product")
     * @ORM\JoinTable(name="accessory_to_product",
     *  joinColumns={@ORM\JoinColumn(name="accessoryid", referencedColumnName="productid")},
     *  inverseJoinColumns={@ORM\JoinColumn(name="accessoryid", referencedColumnName="productid", unique=false)});
     */    
    protected $accessories;




}

したがって、このクエリを Doctrine2 に書き直します。

$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('p')
    ->from('BestBuy\Entity\Product', 'p')
    ->join('p.accessories', 'a', Expr\Join::WITH, $qb->expr()->in('p.productid', ':products'))
    ->setParameter('products', $products);

しかし、これにより次のクエリが得られます。

SELECT 
    p0_.productid AS productid0, 
    p0_.title AS title1, 
    p0_.description AS description2, 
    p0_.insertdate AS insertdate3, 
    p0_.price AS price4, 
    p0_.model AS model5, 
    p0_.categoryid AS categoryid6, 
    p0_.deliverytimeid AS deliverytimeid7, 
    p0_.status AS status8, 
    p0_.weight AS weight9, 
    p0_.pagetitle AS pagetitle10, 
    p0_.metadescription AS metadescription11, 
    p0_.youtubecode AS youtubecode12 
FROM 
    product p0_ 
INNER JOIN 
    accessory_to_product a2_ ON p0_.productid = a2_.accessoryid 
INNER JOIN 
    product p1_ ON p1_.productid = a2_.accessoryid AND (p0_.productid IN (11224))

これは、accessory_to_product テーブルが 2 回結合されていることを除いて、ほぼ正しいです。ヒントはありますか?本当はFROM accessoiresを選択してからproductに参加すればいいのですが、これはproductとの関係なのでできません。

4

1 に答える 1

0

最後にそれが機能しました。私の関係は正しくありませんでした:

/**
*
* @var array
* 
* @ORM\ManyToMany(targetEntity="Product", fetch="EXTRA_LAZY")
* @ORM\JoinTable(name="accessory_to_product",
*  joinColumns={@ORM\JoinColumn(name="accessoryid", referencedColumnName="productid")},
*  inverseJoinColumns={@ORM\JoinColumn(name="accessoryid", referencedColumnName="productid", unique=false)});
*/   

する必要があります:

/**
*
* @var array
* 
* @ORM\ManyToMany(targetEntity="Product", fetch="EXTRA_LAZY")
* @ORM\JoinTable(name="accessory_to_product",
*  joinColumns={@ORM\JoinColumn(name="accessoryid", referencedColumnName="productid")},
*  inverseJoinColumns={@ORM\JoinColumn(name="productid", referencedColumnName="productid", unique=false)});
*/   

原因は、accessory_to_product テーブルに accesoryid と productid の 2 つの列があるためです。次のコード:

    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('p')
            ->from('BestBuy\Entity\Product', 'p')
            ->where($qb->expr()->in('a.productid', ':products'))    
            ->leftJoin('p.accessories', 'a')
            ->setParameter('products', $products);

SQL で次のクエリを作成します。

SELECT 
    p0_.productid AS productid0, 
    p0_.title AS title1, 
    p0_.description AS description2, 
    p0_.insertdate AS insertdate3, 
    p0_.price AS price4,
    p0_.model AS model5, 
    p0_.categoryid AS categoryid6, 
    p0_.deliverytimeid AS deliverytimeid7, 
    p0_.status AS status8, 
    p0_.weight AS weight9, 
    p0_.pagetitle AS pagetitle10, 
    p0_.metadescription AS metadescription11, 
    p0_.youtubecode AS youtubecode12 
FROM 
    product p0_ 
LEFT JOIN 
    accessory_to_product a2_ ON p0_.productid = a2_.accessoryid 
LEFT JOIN 
    product p1_ ON p1_.productid = a2_.productid 
WHERE 
    p1_.productid IN (11224)

元のものとは少し異なりますが、まったく同じ結果が返されます。

于 2012-08-08T09:17:13.853 に答える