Symfony形式ManyToOne OneToMany

我有三个实体,Block,BlockPlacement,BlockPosition:

class BlockEntity
{
    private $bid;
    /**
     * @ORM\OneToMany(
     *     targetEntity="BlockPlacementEntity",
     *     mappedBy="block",
     *     cascade={"remove"})
     */
    private $placements;
}

class BlockPlacementEntity
{
    /**
     * The id of the block postion
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="BlockPositionEntity", inversedBy="placements")
     * @ORM\JoinColumn(name="pid", referencedColumnName="pid", nullable=false)
     */
    private $position;

    /**
     * The id of the block
     *
     * @var BlockEntity
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="BlockEntity", inversedBy="placements")
     * @ORM\JoinColumn(name="bid", referencedColumnName="bid", nullable=false)
     */
    private $block;

    private $sortorder;
}

class BlockPositionEntity
{
    private $pid;
    /**
     * @ORM\OneToMany(
     *     targetEntity="BlockPlacementEntity",
     *     mappedBy="position",
     *     cascade={"remove"})
     * @ORM\OrderBy({"sortorder" = "ASC"})
     */
    private $placements;
}

所以,你可以看到这种关系:Block< OneToMany>放置< ManyToOne>位置.

现在我正在尝试构建一个表单来创建/编辑一个块:

    $builder
        ->add($builder->create('placements', 'entity', [
            'class' => 'Zikula\BlocksModule\Entity\BlockPositionEntity',
            'choice_label' => 'name',
            'multiple' => true,
            'required' => false
        ]))
    ;

这给了我一个很好的选择框,可以选择多个位置的适当列表.但它没有显示之前的展示位置选择(我使用现有数据),例如将位置标记为“已选择”.我还没有尝试创建新的Block,只编辑现有数据.

我怀疑我将需要使用addModelTransformer()或addViewTransformer(),但尝试过其中一些无法使其工作.

我查看了集合表单类型,我不喜欢这个解决方案,因为它不是一个多选框.它需要JS,并不像简单的select元素那样直观.

这对人们来说似乎是一个普遍的问题.我搜索过,发现没有共同的答案,没有任何帮助.

最佳答案 更新:请看这个 example repo

更新2:我已经更新了回购.

我使用表单事件侦听器和未映射的选择字段来完成它.
仔细看看BlockType form type
随意询问有关它的任何问题.

点赞