2

2 つのエンティティ クラス と がProductありOrderEntry、次のように定義されています (簡潔にするために一部の注釈は省略されています)。

class Product {

   /**
    * @Id
    */
   protected $id;

   /**
    * @Column()
    * @Id
    */
   protected $prodNumber;

   /**
    * @Column()
    * @Id
    */
   protected $group;

   // more cols here
}

class OrderEntry {

   // more cols here

   /**
    * @ManyToOne(targetEntity="Product")
    * @JoinColumns({
    *      @JoinColumn(name="prodNumber", referencedColumnName="prodNumber"),
    *      @JoinColumn(name="group", referencedColumnName="group")
    * })
    */
   protected $Product;
}

ここで、クエリ ビルダーを使用して、関連付けられた Product で OrderEntry を見つけたいと考えています。私にとって最も論理的なことはこれです:

class OrderEntryRepository extends EntityRepository  {

    public function findByProduct($product) {
       $qb = $this->getQueryBuilder('o');
       $qb->where($qb->expr()->eq('o.Product', '?1')
          ->setParameter(1, $product)
          ->setMaxResults(1);
       return $qb->getQuery()->execute(); 
    }
}

ただし、これは次のような例外をスローします

複合主キーを持つエンティティへの単一値関連パス式はサポートされていません。クエリで複合主キーのコンポーネントに明示的に名前を付けます。

コンポーネントに明示的に名前を付けるにはどうすればよいですか? JOIN を使用して実行できることはわかっていますが、この場合、Product は使用できず、クエリのコストが高くなるだけです。

4

1 に答える 1

1

products テーブルを現在のマッピングに結合することは避けられません。

public function findByProduct($product) {
   $qb = $this->getQueryBuilder('o');
   $qb
      ->join('o.Product', 'p')
      ->where('p.prodNumber = ?1')
      ->setParameter(1, $product->getProdNumber())
      ->andWhere('p.group = ?2')
      ->setParameter(2, $product->getGroup())
   ;
   return $qb->getQuery()->getOneOrNullResult(); 
}

JoinColumns と同じ列を使用する別のプロパティを OrderEntry に追加できます。

/**
 * @Column(name="prodNumber")
 */
protected $prodNumber;

そして、条件でそれらを使用できます。

... 
->where('o.prodNumber = ?1')
->setParameter(1, $product->getProdNumber()
...
于 2012-04-21T09:32:56.323 に答える