在多对一/一对多关联中持久保存表单集合



我已经阅读并重读了所有可能的地方,但我无法找到我的问题的正确答案。这就是问题所在。我有 2 个实体。设备,设备部分分别。

设备:

/**
 * @ORMOneToMany(
 *     targetEntity="EquipmentPart",
 *     mappedBy="equipment",
 *     orphanRemoval=true,
 *     cascade={"persist"})
 */
private $parts;
public function __construct()
{
    $this->parts = new ArrayCollection();
} 
... getters and setters...
...
public function getParts()
{
    return $this->parts;
}
public function setParts($parts)
{
    $this->parts = $parts;
}

设备部分:

/**
 * @ORMManyToOne(targetEntity="Equipment", inversedBy="parts")
 * @ORMJoinColumn(nullable=false)
 */
private $equipment;
...getters and setters
...
public function getEquipment()
{
    return $this->equipment;
}
public function setEquipment(Equipment $equipment)
{
    $this->equipment = $equipment;
}

设备形式:

$builder->add("parts", CollectionType::class, [
                "label" => false,
                "entry_type" => EquipmentPartForm::class,
                "allow_delete" => true,
                "allow_add" => true,
                "by_reference" => false
            ]);

设备部件窗体仅将部件号和名称作为字段。由于 FK 为空,我不断收到约束错误。

我的控制器非常简单:

public function addEquipment(Request $request)
{
$equipment = new Equipment();
$form = $this->createForm(EquipmentForm::class, $equipment);
    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid()){
        $em = $this->getDoctrine()->getManager();
        $em->persist($form->getData());
        $em->flush();
 ...
 ...

我做错了什么?

你忘记了什么。将设备部件实体添加到设备实体。

//EquipmentEntity
public function addEquipmentPart(EquipmentPart $equipmentPart)
{
    $this->parts[] = $equipmentPart;
    $equipmentPart->setEquipment($this);
}

在您的表单中,选项"by_reference" => false将调用此函数,请参阅文档

我希望我能帮助你

经过无数个小时的寻找,我终于找到了一个答案。我收到约束错误或"无法确定属性的访问类型"(删除setParts setter时(的原因是symfony无法找到我的加法器和删除器方法。

出于某种奇怪的原因,symfony将无法工作或找到加法器或删除器方法,如果它们没有正确的名称。 这样

* public function addEquipmentPart(...)
* public function addEquipmentParts(...)
* public function addParts(...)

行不通

请记住,(在这种情况下(,无论我的属性$parts如何,该方法都是单数的。

正确的方法是:

public function addPart(EquipmentPart $equipmentPart){
    $equipmentPart->setEquipment($this);
    $this->parts[] = $equipmentPart;
}
public function removePart(EquipmentPart $equipmentPart){
    $this->parts->removeElement($equipmentPart);
}

最新更新