2016-10-12 2 views
-1

У меня есть два объекта: Review и User. Существует OneToMany отношения пользователя в User лица:Symfony2 - OneToMany empty ArrayCollection

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

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

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

И соединение в Review лица выглядит, как показано ниже:

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

В контроллере я стараюсь, чтобы получить все отзывы для зарегистрированных пользователей. Таким образом, я использую генератор getReviews(), сгенерированный с консоли.

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

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

Но $reviews кажется пустым, когда я сбросить его, я получаю: object(Doctrine\Common\Collections\ArrayCollection)#285 (1) { ["elements":"Doctrine\Common\Collections\ArrayCollection":private]=> array(0) { } }

Таблицы в базе данных заполняются. Может ли кто-нибудь из вас указать мне, что мне не хватает?

+2

Вы сделать новый пользовательский объект, который будет пустым, конечно. Вы должны загрузить пользователя из базы данных или добавить отзывы с помощью метода $ user-> addReview ($ review); , Если вы хотите видеть ВСЕ обзоры, то вам не требуется релиз. –

+0

@Frankbeen, спасибо за ответ! Я хотел получить отзывы только для пользователя (отзывы с 'owner_id' = текущий идентификатор пользователя). Мне удалось обходным путем вручную создать запрос с Querybuilder doctrine - я думал, что getter - лучший способ получить эти данные, но похоже, что построитель запросов тоже работает. – jwitos

+1

, если вы хотите иметь зарегистрированного пользователя, тогда вы можете просто использовать метод $ user = $ this-> getUser() в контроллере. Или в вашей ситуации: $ review = $ this-> getUser() -> getReviews(); –

ответ

0

Необходимо сначала загрузить зарегистрированного пользователя, а затем загрузить связанный с ним объект.

/** 
* @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

да пусто, becouse коллекция не инициализирован (в свалке есть также «#initialized ложь»)

как инициализирует коллекцию? Есть другие способы, как сделать это:

вызов

$user->getReviews()-count() 

или сделать заказ функции SQL в хранилище

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