2016-05-03 10 views
-1

Ich blieb beim Erhalten ManyToMany Beziehung. Ich habe zwei Einheiten Offer und OfferType. Ich definierte ManyToMany-Beziehung nur auf OfferEntity und es sieht aus wie das Speichern von Angeboten mit mehreren OfferType funktioniert gut in der Datenbank sehe ich korrekte Verbindungstabelle.Holen Sie sich die Beziehung von ManyToMany Entities

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; 
    } 

(...) 

Gerade jetzt, würde Ich mag alle types zum offer zugewiesen bekommen. Ich habe versucht, es wie folgt aus:

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

Leider ich immer Fehler:

[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 

Basierend auf Stackoverflow Antworten auf ähnliche Fragen versucht auch IDENTITY() zu verwenden:

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

Aber dann habe ich :

[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 

Ich würde wirklich alle Hinweise über ManyToMany Beziehung schätzen, vielleicht ist mein Ansatz dafür falsch?

Antwort

0

Ihr Ansatz ist nicht ganz richtig. Sie müssen der Entität beitreten, die Sie laden möchten. Sie sollten etwas mehr Zeit damit verbringen, die Doktrin-Dokumentation zu Entitätsbeziehungen zu lesen & QueryBuilder.

Wie so.

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

Dann wird Ihr Ergebnis enthalten, was Sie wollen.

Hinweis: Sie weiß nicht einmal haben Typen Join-Typen zu bekommen aus einem Angebot, können Sie auch

$offer->getTypes() 

und Typen werden faul Last in Standard Lehre Weise nutzen könnten.

Aber Abfrage wie oben wird Typen im Voraus laden - so vermeiden Sie faul laden. Je nach den Anforderungen kann dies ein besserer Ansatz sein oder auch nicht.

0

Wenn Sie viele zu viele Zuordnungen haben nur auf einer Seite einrichten, werden Sie nur in der Lage sein, für die Offer abzufragen und abzurufen dann die Typen von ihm:

$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(); 

, dass Sie wurde unter der Annahme, nur hatte $offerId mit zu arbeiten. Wenn Sie bereits die ganze Offer Instanz haben, können Sie auch einfach getTypes() darauf anrufen und die Doktrin wird sich um den Rest kümmern.

Wenn Sie waren die inversen Mappings auf der OfferType Einheit definieren, etwa so:

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

Sie könnten Abfragen machen nur für die Typen:

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

$types = $builder->getQuery()->getResult();