我的Category实体使用了KnpLabs/DoctrineBehaviors的可翻译特性和"代理翻译",所以我有一个包含属性"name"的CategoryTranslation实体,当我想获得所有类别的列表时,Symfony调试工具栏会告诉我页面已经运行了数千个查询,加载时间超过5秒。
这是我的代码:
$categories = $this->getDoctrine()
->getManager()
->getRepository('OylexCategoryBundle:Category')
->findAll();
$categoryList = array();
foreach ($categories as $category) {
$categoryList[] = array(
'id' => $category->getId(),
'name' => $category->getName(),
);
}
//To output as json
您可以看到,'name' => $category->getName(),
行为foreach循环的每个迭代生成一个新的查询。
有没有一种方法可以连接转换表,以便在类别旁边获取"name"属性?
我试过了,但它仍然在进行每次呼叫的查询:
$categories = $this->getDoctrine()
->getManager()
->getRepository('OylexCategoryBundle:Category')
->createQueryBuilder('c')
->select(array('c'))
->leftJoin('OylexCategoryBundle:CategoryTranslation', 'ct', 'WITH', 'c.id = ct.translatable AND ct.locale = ''en''')
->getQuery()
->getResult();
谢谢,
技巧是使用可翻译模块提供的映射字段进行连接:
->innerJoin('c.translations', 'ct')