gpt4 book ai didi

symfony - Q : Symfony4 EasyAdmin oneToMany not saving in DB

转载 作者:行者123 更新时间:2023-12-01 11:03:21 24 4
gpt4 key购买 nike

我有 2 个实体,产品(产品)和制造商(制造商)。

当我尝试从 Easy Admin 更新它们时,如果我在产品端更改制造商,一切都很好,它可以工作,并且制造商管理员确实显示了适量的子产品。

但是,如果我反过来做 - 从制造商管理中选择子产品 - 它不会将其保存在数据库中。它确实保存了名称,但不保存子列表。

这里和那里的一些主题表明我必须确保在 addProduct 函数中,我还使用 $product->setManufacturer($this); 对产品进行操作; ...我做了(见下面的代码)。

其他人提到在管理配置中,我应该将 by_reference 选项设置为 false。我也这样做了。然而没有成功。

另一个建议是确保 2 个实体之间的级联正确,我已将其设置为“全部”,直到我弄清楚出了什么问题,但它仍然不起作用。没有错误信息,没有警告,它甚至会保存其他字段,但不会保存这个字段。任何的想法 ?

产品 :

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="App\Repository\ProduitRepository")
*/
class Produit
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string", length=255)
*/
private $nom;

/**
* @ORM\ManyToOne(targetEntity="Fabricant", inversedBy="produits", cascade="all")
*/
private $fabricant;

public function __toString()
{
return ($this->nom != null) ? $this->nom : '';
}

public function getId()
{
return $this->id;
}

public function setId($id)
{
$this->id = $id;

return $this;
}

public function getNom()
{
return $this->nom;
}

public function setNom($nom)
{
$this->nom = $nom;

return $this;
}

public function getFabricant()
{
return $this->fabricant;
}

public function setFabricant($fabricant)
{
$this->fabricant = $fabricant;

return $this;
}
}

制造商 :
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\Entity(repositoryClass="App\Repository\FabricantRepository")
*/
class Fabricant
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string", length=255)
*/
private $nom;

/**
* @ORM\OneToMany(targetEntity="Produit", mappedBy="fabricant", cascade="all")
*/
private $produits;

public function __toString()
{
return ($this->nom != null) ? $this->nom : '';
}

public function __construct()
{
$this->produits = new ArrayCollection();
}

public function getId()
{
return $this->id;
}

public function setId($id)
{
$this->id = $id;

return $this;
}

public function getNom()
{
return $this->nom;
}

public function setNom($nom)
{
$this->nom = $nom;

return $this;
}

public function getProduits()
{
return $this->produits;
}

public function addProduit(Produit $produit)
{
if ($this->produits->contains($produit)) {
return;
}
$this->produits[] = $produit;
$produit->setFabricant($this);
return $this;
}

public function removeProduit($produit)
{
$this->produits->removeElement($produit);
$produit->setFabricant(null);
}
}

简单的管理员 yaml 配置:
easy_admin:
entities:
Produit:
class: App\Entity\Produit
list:
fields:
- id
- nom
- fabricant
new:
fields:
- nom
- { property: 'fabricant', type_options: { 'by_reference': false } }
Fabricant:
class: App\Entity\Fabricant
list:
fields:
- id
- nom
- produits
new:
fields:
- nom
- { property: 'produits', type_options: { by_reference: false } }
edit:
fields:
- nom
- { property: 'produits', type_options: { multiple: true, by_reference: false } }

最佳答案

原因是 bug in EasyAdmin controller它使用具体的 $entity 调用 flush(),因此不会保留其他更改。您可以等待新版本或 extend AdminController and override methods .

控制类的变化:

easy_admin_bundle:
resource: 'App\Controller\AdminController'
prefix: /admin
type: annotation

扩展管理 Controller :
<?php
namespace App\Controller;

use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController as BaseAdminController;

class AdminController extends BaseAdminController
{
protected function persistEntity($entity)
{
$this->em->persist($entity);
$this->em->flush();
}

protected function updateEntity($entity)
{
$this->em->flush();
}

protected function removeEntity($entity)
{
$this->em->remove($entity);
$this->em->flush();
}
}

关于symfony - Q : Symfony4 EasyAdmin oneToMany not saving in DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com