2016-05-03 3 views
-1

Я застрял в получении отношения ManyToMany. У меня есть два объекта: Offer и OfferType. Я определил отношение 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; 
    } 

(...) 

Прямо сейчас, я хотел бы получить все types назначенный offer. Я пробовал так:

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

К сожалению, я получаю сообщение об ошибке:

[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 

Основываясь на StackOverflow ответы на подобные вопросы попробовал также использовать IDENTITY():

// $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(), и доктрина позаботится обо всем остальном.

Если вы должны были определить обратные отображения на 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(); 
Смежные вопросы