我已经阅读并重读了所有可能的地方,但我无法找到我的问题的正确答案。这就是问题所在。我有 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);
}