Doctrine Query Builder Результат: неправильный цикл

Я не уверен, что это не правильно, но это дает мне ошибку:

У меня есть 2 сущности: Task и TaskUser. Они связаны одним человеком.

Что я хочу сделать, это:

foreach($tasks as $task){
echo $task->getTitle;
echo $task->getTaskUser()->getFirstName();
}

Это мой запрос в репозитории задач:

    public function findTasksByUsers($user = false)
{

if($user){

$qb = $this->_em->createQueryBuilder();

$qb
->select('t', 'tu')
->from('\Entities\Task', 't')
->leftJoin('\Entities\TaskUser', 'tu',  \Doctrine\ORM\Query\Expr\Join::WITH, 't.id = tu.task')
->where('tu = :user')
->setParameter('user', $user)
->orderBy('t.createDate', 'DESC');

return $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);

}

}

Когда я делаю этот цикл:

$tasks = $this->em->getRepository('\Entities\Task')->findTasksByUsers($user);

foreach($tasks as $task){
echo $task->getTitle();
}

Я получаю заголовок первой задачи, а затем ошибку, подобную этой:

Title of first task
Fatal error: Call to undefined method Entities\TaskUser::getTitle() in D:\sites\db\application\controllers\TasksController.php on line 35

Есть идеи, почему это происходит? Спасибо!

1

Решение

$qb->select('t', 'tu')

проблема здесь, когда вы выбираете обе сущности.

Если вы хотите только Task лицо изменить ваш DQL следующим образом

$qb->select('t')

Однако, для меня, вы могли бы действовать только таким образом (в вашем контроллере; если вы не в контроллере, используйте DI для доступа к диспетчеру сущностей)

//retrieve all TaskUser object
$em = $this->getDoctrine()->getManager();
$tu_repo = $em->getRepository('YourBundleName:TaskUser');
$tu_array_collection = $tu_repo->findBy(array('user'=>$user));
foreach ($tu_array_collection as $tu) {
$first_name = $tu->getFirstName();
foreach ($tu->getTasks() as $task) {
echo $first_name;
echo $task->getTitle();
}
}

конечно, вам может понадобиться адаптировать свой код с правильным findBy массив, и с правильными методами из TaskUser юридическое лицо

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]