Doctrine Query Builder 结果:没有正确循环
Doctrine Query Builder Result: not looping correctly
我不确定是不是我做的不正确,但这给了我一个错误:
我有 2 个实体:Task 和 TaskUser。它们通过 onetoMany 连接。
我想做的是:
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
知道为什么会这样吗?谢谢!
$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
实体
的正确方法来调整您的代码
我不确定是不是我做的不正确,但这给了我一个错误:
我有 2 个实体:Task 和 TaskUser。它们通过 onetoMany 连接。
我想做的是:
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
知道为什么会这样吗?谢谢!
$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
实体