【问题标题】:Query only works if I run a query before it仅当我在它之前运行查询时,查询才有效
【发布时间】:2013-06-10 04:30:23
【问题描述】:

我想获取用户所在的学校,但由于某种原因,我只能通过对不相关的学校表运行查询来访问它。这是我的代码:

这不起作用(在控制器内):

$schoolsEnrolled = $this->getUser()->getSchools();

结果是一个数组,其中包含一个 School 对象,其所有属性都为 null(由于某种原因,id 除外)。

这确实有效(在控制器内):

//unrelated query
$repository = $this->getDoctrine()->getRepository('AcmeMainBundle:School');
$query = $repository->createQueryBuilder('s')->getQuery();
$schools = $query->getResult();

//the query I care about
$schoolsEnrolled = $this->getUser()->getSchools();

结果是所需的学校数组。

相关方法如下:

在学校课堂上:

public function getSchools(){
    $schools = array();
    foreach ($this->schoolHasUsers as $key=>$schoolHasUser){
        $schools[] = $schoolHasUser->getSchool();
    }
    return $schools;
}

在 SchoolHasUser 类中:

public function getSchool()
{
    return $this->school;
}

如果没有不相关的查询,我如何才能让我关心的查询正常工作?

【问题讨论】:

  • 也许你不需要无关查询,只需要激活存储库:$this->getDoctrine()->getRepository('AcmeMainBundle:School'); ?
  • 我试过没有查询,但它不起作用。我需要 $schools = $query->getResult();行。

标签: symfony controller doctrine


【解决方案1】:

在学说中对象可以被延迟加载。然后你打电话$schoolHasUser->getSchool();你真的没有查询数据库,只得到代理对象。所以尝试获取它的一些属性,例如 getName 或 getId。此操作调用 DB 并获取对象。

【讨论】:

  • 成功了!我将 User 类中的 Method getSchools() 更改为 $schools[] = $schoolHasUser->getSchool()->getName();但是,有没有一种方法可以让我获得整个对象而无需显式获取每个属性?
  • 收到一个属性后,您将获得整个对象。你可以 var_dump 看看。
【解决方案2】:

这样做的正确方法之一是这样

$em = $this->getDoctrine()->getManager();

$entities = $em->getRepository('YourBundle:YourEntity')->findAll();

【讨论】:

  • 我并不想全部查找,我只想在 SchoolHasUser 表中查找与用户关联的学校。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多