gpt4 book ai didi

php - Symfony OneToMany 更新而不是插入

转载 作者:行者123 更新时间:2023-12-05 07:31:02 25 4
gpt4 key购买 nike

我是 Symfony 的初学者。

我的表格有一个奇怪的问题。

我有 2 个实体:Proposal_Lsi 和 Lsi_Beams。一个proposal可以有多个beam,但是一个beam只能有一个proposal。我想我应该使用 OneToMany/ManyToOne 关系,我的拥有方是梁一,反面是提案。

我遵循了官方指南 https://symfony.com/doc/3.1/form/form_collections.html关于表单集合。

一切都很好,我可以提交一个包含多个光束的新提案,并且所有都正确存储在数据库中。

问题 每当我尝试向我的提案中添加新梁时就会发生:系统会覆盖(更新查询)现有梁(从数据库中的第一个梁开始)而不是添加新梁(插入查询)。

我错过了什么?

如果有帮助的话,这是我的一些代码。

提案类别:

class Proposal_lsi{
/**
* @ORM\OneToOne(targetEntity="Emir2Bundle\Entity\Proposal", inversedBy="proposal_lsi")
* @ORM\JoinColumn(name="proposal", referencedColumnName="id")
* @ORM\Id
*/
private $proposal;

/**
* @ORM\OneToMany(targetEntity="Emir2Bundle\Entity\Lsi_beams", mappedBy="proposal_lsi")
*/
private $lsi_beams;

...

/**
* Add lsiBeam
*
* @param \Emir2Bundle\Entity\Lsi_beams $lsiBeam
* @return Proposal_lsi
*/
public function addLsiBeam(\Emir2Bundle\Entity\Lsi_beams $lsiBeam)
{
$lsiBeam->setProposalLsi($this);
$this->lsi_beams[] = $lsiBeam;

return $this;
}

}

梁类:

class Lsi_beams{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="Emir2Bundle\Entity\Proposal_lsi", inversedBy="lsi_beams", cascade={"persist"})
* @ORM\JoinColumn(name="proposal_lsi", referencedColumnName="proposal", nullable=false)
*/
private $proposal_lsi;

...
}

Controller 中的表单:

$form = $this->createFormBuilder($proposallsi)
->setAction($this->generateUrl('lsi_submission', array('id' => $id)))
->setMethod('POST')
->add('lsi_beams', CollectionType::class, array(
'entry_type' => LsiBeamsType::class,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false
)
)
...

我做错了什么?如果您需要更多代码,请告诉我。

感谢任何回复!

最佳答案

注意事项:

  1. 使用 Doctrine ArrayCollection 更好地跟踪集合
  2. cascade={"persist"} 放在关联的反面(你有 mappedBy 的地方)
  3. 保持实体名称为单数(例如 Lsi_beam 而不是 Lsi_beams)
  4. 让您的命名策略清晰明了。不要在类和属性名称中使用下划线(例如,使用 $lsiBeams 而不是 $lsi_beams)

提案Lsi

use Doctrine\Common\Collections\ArrayCollection;

class ProposalLsi
{
/**
* @ORM\OneToMany(targetEntity="LsiBeam", mappedBy="proposalLsi", cascade={"persist"})
*/
private $lsiBeams;

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

public function addLsiBeam(LsiBeams $lsiBeam)
{
if ($this->lsiBeams->contains($lsiBeam)) {

return;
} else {

$lsiBeam->setProposalLsi($this);
$this->lsiBeams->add($lsiBeam);
}

return $this;
}

public function removeLsiBeam(LsiBeams $lsiBeam)
{
if (!$this->lsiBeams->contains($lsiBeam)) {

return;
} else {

$lsiBeam->setProposalLsi(null);
$this->lsiBeams->removeElement($lsiBeam);
}

return $this;
}
}

激光束

class LsiBeam
{
/**
* @ORM\ManyToOne(targetEntity="ProposalLsi", inversedBy="lsiBeams")
*/
private $proposalLsi;

public function setProposalLsi(?ProposalLsi $proposalLsi)
{
$this->proposalLsi = $proposalLsi;
}

}

关于php - Symfony OneToMany 更新而不是插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51970736/

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