【问题标题】:Symfony2 : Display fetch join result in twigSymfony2:在树枝中显示获取连接结果
【发布时间】:2015-05-18 09:13:58
【问题描述】:

我只是想从一个表(建筑物)中列出一个视图中的所有实体,该表需要一个连接来显示一些细节(建筑物管理)。我想使用 Doctrine fetch join 选项来避免额外的查询,因为每个建筑物都必须显示其建筑物管理中的数据。

下面是一个基本的控制器示例。我的问题是必须在选择中包含bm 才能使用提取而不是常规连接。因此,$entities 变量包含bbm 实体,Twig 中的循环只等待b 实体。我该如何解决?

public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    // This way is working, but extra queries are generated when I need to access the BuildingManagement data from Building entity
    //$entities = $em->getRepository('TrilogisPropertyBundle:Building')->findAll();

    $entities = $em->createQuery(
            'SELECT b, bm
             FROM MyBundle:Building b
             JOIN MyBundle:BuildingManagement bm WITH bm.building = b.id
             ORDER BY b.id')                                   
            ->getResult();

    return $this->render('MyBundle:Test:index.html.twig', array(
        'entities' => $entities,
    ));
}

在 TWIG 中

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Building Management</th>
        </tr>
    </thead>
    <tbody>
    {% for entity in entities %}
        <tr>
            <td>{{ entity.id }}</td>     
            <td>{{ entity.buildingManagement.id}}</td> <-- will crash because the entity must be a building and not a buildingManagement                                            
        </tr>
    {% endfor %}
    </tbody>
</table>

【问题讨论】:

  • Building 和 BuildingManagement 之间有任何 ORM 关系吗?这样,您就可以从 Building 实体访问 BuildingManagement
  • @Cr3aHal0 我当然有关系。但您需要注意,从 Building 访问 BuildingManagement 会创建一个我想避免的额外查询

标签: php symfony doctrine-orm


【解决方案1】:

如果你在评论中所说的关于这两者之间的关系是正确的,那么你可能以错误的方式做JOIN

查询应该是:

$entities = $em->createQuery(
            'SELECT b, bm
             FROM MyBundle:Building b
             JOIN b.buildingManagement bm
             ORDER BY b.id')                                   
            ->getResult();

注意事项:

  • 您需要在您的Building 实体中添加一个buildingManagement 成员才能使其正常工作。
  • 从外观上看,buildingManagement 应该是用@ManyToOne 注释的。可能是@ManyToMany,但这取决于应用的逻辑。
  • (可选)buildingManagement 应标记为反转。如果您使用实体(两者)更新您的问题,我们可以帮助您确定。

【讨论】:

  • 谢谢,指定连接表的捆绑包以不水合建筑对象并将 buildingManagement 作为行返回。
  • 啊太棒了! :) 很高兴我能帮上忙 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2015-12-10
  • 2012-09-16
相关资源
最近更新 更多