在symfony2中,我想生成多选选项。 我想得到这样的东西:
<select>
<optgroup label="district 1">
<option>city 1</option>
<option>city 2</option>
</optgroup>
<optgroup label="district 2">
<option>city X</option>
<option>city Y</option>
</optgroup>
</select>
我的位置实体是:
class Location
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Location", inversedBy="children")
* @ORM\JoinColumn(name="pid", nullable=true)
*/
protected $parent;
/**
* @ORM\OneToMany(targetEntity="Location", mappedBy="parent")
*/
protected $children;
/**
* @var string
* @ORM\Column(name="name", type="string", length=255)
*/
protected $name;
所以mysql看起来像:
id, pid, name
1, null, district 1
2, null, district 2
3, 1, city 1
4, 1, city 2
5, 2, city X
6, 2, city Y
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:9)
对于a.aitboudad和我的一个朋友,我找到了解决方案。
我必须输入我的Locaton实体:
public function getParentName() {
return $this->getParent() ? $this->getParent()->getName() : null;
}
然后我通过以下方式生成了我的表单:
$builder->add('locations', 'entity', array(
'class' => 'MyBundle:Location',
'group_by' => 'parentName',
'property' => 'name',
'query_builder' => function (\Doctrine\ORM\EntityRepository $repo) {
$qb = $repo->createQueryBuilder('l');
$qb->andWhere('l.parent IS NOT NULL');
return $qb;
}
))
答案 1 :(得分:5)
您只需在实体字段类型中添加选项group_by即可。
示例:
$builder->add('children', 'entity', array(
'class' => 'AcmeYourBundle:Location',
'group_by' => 'parent'
...
));
答案 2 :(得分:0)
Symfony 4解决方案,非常简单。
您可以简单地使用“ parent.field”表示法。
->add('campaign', EntityType::class,[
'class' => Campaigns::class,
'required' => false,
'choice_label' => 'name',
'group_by' => 'client.name',
'query_builder' => function (CampaignsRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.name', 'ASC');
},
])