2

クエリビルダーについて簡単な質問がありますが、答えが見つかりません...

商品リストのフィルターを作成し、選択した属性がアイテム(商品のアイテム)のarrayCollection「属性」にあるかどうかを確認したいと思います。

これがItemエンティティの私の属性arrayCollectionです:

/**
*
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Attribute", inversedBy="items")
* @ORM\JoinTable(name="catalog_items_x_attributes", joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")}, inverseJoinColumns={@ORM\JoinColumn(name="attribute_id", referencedColumnName="id")})
*/ 
private $attributes;

これがProductRepositoryの私の関数です(製品には1-x個のアイテムがありました):

public function listWithFilters($idCat, $filt)
{      
    $em = $this->getEntityManager();
    $qb = $em->createQueryBuilder();
    $cat = $em->getRepository('WebformanceCatalogBundle:Category')
     ->findById($idCat);<br />
    $right = $cat[0]->getRight();
    $left = $cat[0]->getLeft();
    $query = $qb
            ->select('p')
            ->from('Webformance\CatalogBundle\Entity\Product', 'p')
            ->leftJoin('Webformance\CatalogBundle\Entity\Item', 'i', 'WITH', 'i.product = p.id' )
            ->leftJoin('Webformance\CatalogBundle\Entity\Category', 'c', 'WITH', 'p.category = c.id')
            ->where('c.right <= :right')
            ->andWhere('c.left >= :left')
            ->andWhere($qb->expr()->between('i.salePrice', ':minPrice', ':maxPrice'))
            ->andWhere($qb->expr()->between('i.weight', ':minWeight', ':maxWeight'))
            ->setParameters(array('right' => $right,
                                    'left' => $left,
                                    'minPrice' => $filt['price-min'],
                                    'maxPrice' => $filt['price-max'], 
                                    'minWeight' => $filt['weight-min'],
                                    'maxWeight' => $filt['weight-max']
                ));
            if (!empty($filt['manufacturer'])) {
               $query
                ->andWhere($qb->expr()->in('p.manufacturer', ':manufacturers'))
                ->setParameter('manufacturers', $filt['manufacturer']);
            }

/***** problem on this part ******/
// I have already try without the "getRepository" just with the ID.
                if (!empty($filt['att'])) {
                    foreach($filt['att'] as $attId) {
                        $attribute = $em->getRepository('WebformanceCatalogBundle:Attribute')
                         ->findById($attId);
                        $query
                            ->andWhere($qb->expr()->in(':attributes', 'i.attributes'))
                            ->setParameter('attributes', $attribute[0]);
                    }
                }
/********************************/
        $result = $query->getQuery()->getResult();
        return $result;
    }  

だから、私は次のようなエラーがあります:

[Syntax Error] line 0, col 406: Error: Expected Literal, got 'i'

しかし、私が欲しいものを見つけるために私が良い方法を使うかどうかはわかりません。

4

0 に答える 0