保存多对多关系的反面

时间:2018-05-25 14:48:14

标签: forms symfony symfony4 bidirectional-relation

我尝试将关系保存在关系的反面。我知道这在Doctrine中是不可能的,但我发现了各种可能的文章。问题是所描述的方式对我不起作用。

我的出发基础:

我在多对多关系中有两个实体。

// Widget.php

/**
* @ORM\ManyToMany(targetEntity="App\Entity\Layout", mappedBy="widgets", cascade={"persist"})
*/
private $layouts;

// Layout.php

/**
* @ORM\ManyToMany(targetEntity="App\Entity\Widget", inversedBy="layouts", cascade={"persist"})
*/
private $widgets;

我为两个实体提供了getter,setter和一个add和remove方法。他们看起来像这样(两者都是一样的):

public function setLayouts(ArrayCollection $layouts) {
    $this->layouts->clear();
    foreach ($layouts as $layout) {
        $this->addLayout($layout);
    }
    return $this;
}

public function getLayouts() {
    return $this->layouts;
}

public function addLayout(Layout $layout) {
    if ($this->layouts->contains($layout)) {
        return $this;
    }
    $this->layouts->add($layout);
    $layout->addWidget($this);
    return $this;
}

public function removeLayout(Layout $layout) {
    if (!$this->layouts->contains($layout)) {
        return $this;
    }
    $this->layouts->removeElement($layout);
    $layout->removeWidget($this);
    return $this;
}

所以我的拥有方是这种情况下的布局。另外,我有两个实体的FormTypes:

class LayoutType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('widgets', EntityType::class, [
            'required' => true,
            'class' => Widget::class,
            'multiple' => true,
        ]);
...

class WidgetType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('layouts', EntityType::class, [
            'required' => false,
            'class' => Layout::class,
            'multiple' => true,
            'by_reference' => false,
        ]);
...

最后我的控制器(布局控制器看起来一样):

public function postAction(Request $request) {
    $widget = new Widget();

    $formFactory = $this->container->get('form.factory');
    $form = $formFactory->createNamed('', WidgetType::class, $widget, ['method' => 'POST']);
    $form->handleRequest($request);

    if (!$form->isValid()) {
        return View::create($form, Response::HTTP_BAD_REQUEST);
    }

    $em = $this->getDoctrine()->getManager();
    $em->persist($widget);
    $em->flush();

    return View::create($widget);
...

可能的解决方案:

我为所有实体使用Symfony表单,因此应该可以在特定字段中添加'by_reference' => false。我在这里找到了这个解决方案: https://afilina.com/doctrine-not-saving-manytomany 如上所述,我已添加了该选项。

我的问题:

第一方面,保存布局并向其添加小部件,效果很好。但另一方面,保存小部件并为其添加布局并不起作用。为什么会这样?我使用的是最新版本的Smyfony(4.0.10)。这可能是问题吗?

感谢您的帮助!

0 个答案:

没有答案
相关问题