【问题标题】:Persisting Collection of Forms in a ManyToOne/OneToMany association在多对一/一对多关联中保持表单集合
【发布时间】:2018-01-18 23:02:09
【问题描述】:

我已经阅读了一遍又一遍,但我无法找到问题的正确答案。这是问题所在。我有 2 个实体。分别是设备、设备部分。

设备:

/**
 * @ORM\OneToMany(
 *     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;
}

设备部分:

/**
 * @ORM\ManyToOne(targetEntity="Equipment", inversedBy="parts")
 * @ORM\JoinColumn(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();
 ...
 ...

我做错了什么?

【问题讨论】:

    标签: symfony symfony-3.2


    【解决方案1】:

    你忘记了什么。将 EquipmentPart 实体添加到 Equipment 实体。

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

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

    希望对你有帮助

    【讨论】:

    • 我有方法,但是问题依旧。
    【解决方案2】:

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

    由于某些奇怪的原因,如果 adder 或 remover 方法没有正确的名称,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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2014-03-24
      • 2010-12-20
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多