2016-05-03 11 views
-1

ManyToMany関係を取得することに固執しました。私は2つのエンティティOfferOfferTypeを持っています。 ManyToMany関係はOfferEntityにしか定義されておらず、OfferTypeが複数で保存されているように見えます。ManyToManyエンティティの関係を取得します。

OfferEntity.php

/** 
* Offer Entity 
* 
* @ORM\Table(name="offer") 
* @ORM\Entity(repositoryClass="ProjectBundle\Repository\OfferRepository") 
*/ 
class Offer 
{ 
    /** 
    * @Assert\Count(
    *  min = "1", 
    *  minMessage = "You must specify at least one offer type." 
    *) 
    * @ORM\ManyToMany(targetEntity="OfferType") 
    */ 
    private $types; 

    public function __construct() 
    { 
     $this->types = new ArrayCollection(); 
    } 

    /** 
    * @return ArrayCollection 
    */ 
    public function getTypes() 
    { 
     return $this->types; 
    } 

(...) 

は今のところ、私はofferに割り当てられたすべてのtypesを取得したいと思います。

// $offer is an Entity 
$query = $em->createQueryBuilder() 
    ->select('offer.types') 
    ->from('ProjectBundle:Offer', 'offer') 
    ->where('offer = :offer') 
    ->setParameters([ 
     'offer' => $offer 
    ]); 

は、残念ながら、私はエラーを取得:同様の質問のための答えはIDENTITY()を使用することも、それを試してみましたのStackOverflowに基づいて

[2/2] QueryException: [Semantical Error] line 0, col 13 near 'types FROM ProjectBundle:Offer': Error: Invalid PathExpression. Must be a **StateFieldPathExpression**. 
[1/2] QueryException: SELECT offer.types FROM ProjectBundle:Offer offer WHERE offer = :offer 

:私はこのようにそれを試してみました

// $offer is an Entity 
$query = $em->createQueryBuilder() 
    ->select('IDENTITY(offer.types)') 
    ->from('ProjectBundle:Offer', 'offer') 
    ->where('offer = :offer') 
    ->setParameters([ 
     'offer' => $offer 
    ]); 

しかし、その後、私は持っています:

[2/2] QueryException: [Semantical Error] line 0, col 22 near 'types) FROM ProjectBundle:Offer': Error: Invalid PathExpression. Must be a SingleValuedAssociationField. 
[1/2] QueryException: SELECT IDENTITY(offer.types) FROM ProjectBundle:Offer offer WHERE offer = :offer 

ManyToMany関係を取得することに関するヒントは本当にありがたいです。私のアプローチは間違っていますか?

答えて

0

あなたのアプローチは正しくはありません。ロードするエンティティに参加する必要があります。エンティティリレーション& querybuilderに関する教義文書を読むのにもう少し時間を費やす必要があります。

$query = $em->createQueryBuilder() 
    ->select('offer', 'types') 
    ->from('ProjectBundle:Offer', 'offer') 
    ->join('offer.types', 'types') 
    ->where('offer = :offer') 
    ->setParameters([ 
     'offer' => $offer 
    ]); 

結果には、必要なものが含まれます。

:あなたも、あなたも

$offer->getTypes() 

とタイプを使用することができます提供から種類を取得する種類に参加するを持っていないでしょう標準の教義の方法で遅延ロード。

しかし、上記のようにクエリを実行すると、事前に型がロードされるため、遅延読み込みを回避できます。これは、要件に応じてより良いアプローチである場合とそうでない場合があります。

0

あなたが片側だけに設定多くのマッピングへのあなたの多くを持っている場合は、あなただけOfferを照会し、それから種類を取得することができます:

$builder = $em->createQueryBuilder() 
    ->select('o', 't') 
    ->from('ProjectBundle:Offer', 'o') 
    ->join('o.types', 't') 
    ->where('o.id = :offer') 
    ->setParameter('offer', $offerId); 

$offer = $builder->getQuery()->getOneOrNullResult(); 
$types = $offer->getTypes(); 

だけを想定しました処理するには$offerIdが必要でした。すでにOfferインスタンスがある場合は、getTypes()を呼び出すだけで、doctrineが残りの部分を処理します。

あなたがそうのようOfferTypeエンティティに逆マッピングを定義した場合:

class OfferType 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Offer", mappedBy="types") 
    */ 
    private $offers; 
} 

をあなただけのタイプのクエリを作ることができる:

$builder = $em->createQueryBuilder() 
    ->select('t') 
    ->from('ProjectBundle:OfferType', 't') 
    ->join('t.offers', 'o') 
    ->where('o = :offer') 
    ->setParameter('offer', $offer); 

$types = $builder->getQuery()->getResult(); 
関連する問題