在窗体的实体字段中显示父项的信息

时间:2016-02-20 22:50:15

标签: forms symfony doctrine-orm

方案

作为创建ClassC实例的表单的一部分,我想通过其ID选择父ClassB。

这没问题,可以这样做:

->add('classB_id', 'entity', [
      'class' => 'NodeBundle:ClassB',
      'choice_label' => 'name'
])

现在,ClassB有一个ClassA父级,而不是只显示ClassB的name,我想显示ClassB.name (ClassA.name),因此它会在select中创建选项,例如

<option value="4">SomeClassB (ParentClassA)</option>

这是因为我可能有同名的ClassB实例,但属于ClassA的不同实例。

到目前为止我有什么

->add('classB_id', 'entity', [
    'class' => 'NodeBundle:ClassB',
    'choice_label' => 'name',
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('b')
            ->leftJoin('NodeBundle:ClassA', 'a', 'WITH', 'b.classA_id = a.id')
            ->orderBy('p.classA_id', 'ASC');
    }
])

问题

如何编辑choice_label选项以包含来自父类A的信息的格式显示它?

1 个答案:

答案 0 :(得分:0)

我能够自己找到一个解决方案,虽然我非常愿意改进,因为它闻起来很糟糕。

'choice_label' => function($classB) {
    $em = $this->getDoctrine()->getManager()->getRepository('NodeBundle:ClassA');
    return $classB->getName() . ' - ' . $em->findOneBy(['id' => $classB->getClassAId()])->getName();
}

这将获取ClassA的父实例,并将其名称附加到选项标签。但它闻起来很糟糕的原因是它为每个选项进行了数据库查询。

在我的特定情况下,它没有那么重要,因为

  1. 列表中的选项很少

  2. 它仅供管理员使用,其中只有一个 - 我

  3. 对于任何其他情况,我说这是一种不好的方式,这就是为什么我对新建议持开放态度。