方案
作为创建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的信息的格式显示它?
答案 0 :(得分:0)
我能够自己找到一个解决方案,虽然我非常愿意改进,因为它闻起来很糟糕。
'choice_label' => function($classB) {
$em = $this->getDoctrine()->getManager()->getRepository('NodeBundle:ClassA');
return $classB->getName() . ' - ' . $em->findOneBy(['id' => $classB->getClassAId()])->getName();
}
这将获取ClassA的父实例,并将其名称附加到选项标签。但它闻起来很糟糕的原因是它为每个选项进行了数据库查询。
在我的特定情况下,它没有那么重要,因为
列表中的选项很少
它仅供管理员使用,其中只有一个 - 我
对于任何其他情况,我说这是一种不好的方式,这就是为什么我对新建议持开放态度。