2016-10-12 2 views
-1

Ich habe zwei Einheiten: Review und User. Es gibt einen OneToMany Beziehung des Benutzers in User Einheit:Symfony2 - OneToMany leer ArrayCollection

/** 
* @ORM\OneToMany(targetEntity="Review", mappedBy="owner") 
*/ 
protected $reviews; 

public function __construct() { 
    parent::__construct(); 

    $this->reviews = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

Und Verbindung in Review Einheit sieht aus wie folgt:

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="reviews") 
* @ORM\JoinColumn(name="owner_id", referencedColumnName="id") 
*/ 
private $owner; 

In einem Controller, ich versuche, für angemeldete Benutzer alle Bewertungen zu erhalten. Also benutze ich einen getReviews() Getter von der Konsole generiert.

/** 
* @Route("/dashboard") 
*/ 
public function dashboardShow() { 
    $user = new User(); 
    $reviews = $user->getReviews(); 

    return $this->render('dashboard.html.twig', array(
    'reviews' => $reviews 
    )); 
} 

Aber $reviews scheint leer, wenn ich es Dump, die ich erhalten: object(Doctrine\Common\Collections\ArrayCollection)#285 (1) { ["elements":"Doctrine\Common\Collections\ArrayCollection":private]=> array(0) { } }

Tabellen in der Datenbank bestückt sind. Könnte irgendjemand von euch mir zeigen, was ich vermisse?

+2

Sie machen eine neue User-Einheit machen, die leer natürlich sein wird. Sie sollten den Benutzer aus der Datenbank laden oder die Bewertungen mit einer Methode wie $ user-> addReview ($ review); . Wenn Sie ALLE Bewertungen sehen möchten, brauchen Sie keine Beziehung. –

+0

@Frankbeen, danke für die Antwort! Ich wollte Bewertungen nur für den Benutzer erhalten (Bewertungen mit 'owner_id' = aktuell angemeldete Benutzer-ID). Es ist mir gelungen, die Problemumgehung zu umgehen, indem ich manuell eine Abfrage mit dem QueryBuilder von Doctrine erstelle - ich dachte, Getter wäre eine bessere Methode, um diese Daten zu erhalten, aber es scheint, dass der Query Builder auch funktioniert. – jwitos

+1

Wenn Sie den aktuell angemeldeten Benutzer haben möchten, können Sie einfach die Methode $ user = $ this-> getUser() im Controller verwenden. Oder in Ihrer Situation: $ reviews = $ this-> getUser() -> getReviews(); –

Antwort

0

Sie müssen zuerst den angemeldeten Benutzer abrufen und dann die zugehörige Entität laden.

/** 
* @Route("/dashboard") 
*/ 
public function dashboardShow() { 
    // Pulls the currently authenticated user from symfony internals 
    $user = $this->getUser(); 
    // If your authentication provider already pulls this entity from the database 
    // you can skip this step and just use $user->getReviews(); below. 
    $userEntity = $this->get('doctrine') 
     ->getManager() 
     ->getRepository('NamespacedBundle:User') 
     ->findOne($user->getId()); 

    $reviews = $userEntity->getReviews(); 

    return $this->render('dashboard.html.twig', array(
     'reviews' => $reviews 
    )); 
} 
0

ja, es ist leer, becouse Sammlung ist nicht initialisiert (in Dump es auch ist "#initialized: false")

wie Sammlung initialisieren? gibt es mehr Möglichkeiten, wie es zu tun:

Anruf

$user->getReviews()-count() 

oder benutzerdefinierte SQL-Funktion in Repository

$this->createQueryBuilder('user') 
->select('user, reviews') 
->leftJoin('user.review', 'reviews') 
->getQuery()->getResult(); 
Verwandte Themen