Symfony Doctrine - 如何生成optgroup选择表单

5
在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

有人可以帮我解决这个问题吗?

你能否解释一下你目前尝试了什么?你能包含一下你目前拥有的表单字段吗? - Nicolai Fröhlich
3个回答

9
感谢 a.aitboudad 和我的一位朋友,我已经找到了解决方案。
我必须在我的 Location 实体中输入以下内容:
    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;
                }
            ))  

7
您可以在实体字段类型中添加选项group_by
示例:
$builder->add('children', 'entity', array(
    'class'    => 'AcmeYourBundle:Location',
    'group_by' => 'parent'
    ...
));

没想到这么简单。 - edditor

1

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');
                },

            ])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接