我试图使在关系的反面保存关系成为可能。我知道这在 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 表单,因此应该可以将 a 添加'by_reference' => false
到特定字段。例如,我在这里找到了这个解决方案:
https ://afilina.com/doctrine-not-saving-manytomany
如您在上面看到的,我已经添加了该选项。
我的问题:
第一方面,保存布局并向其中添加小部件,效果很好。但另一方面,保存 Widget 并向其添加布局不起作用。为什么呢?我正在使用最新版本的 Smyfony (4.0.10)。这可能是问题吗?
感谢帮助!