我有“项目”实体,可以有多种福利,而福利只属于一个项目: 对我而言似乎是一对多 - 一对多的关系。 我按照指示here
项目实体是:
/**
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProjectRepository")
* @ORM\Table(name="projects")
*/
class Project
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\oneToMany(targetEntity="Benefit", mappedBy="project")
*/
protected $benefits;
/**
* Constructor
*/
public function __construct()
{
$this->benefits = new \Doctrine\Common\Collections\ArrayCollection();
}
// other stuff
/**
* Add benefits
*
* @param \AppBundle\Entity\Benefit $benefits
* @return Project
*/
public function addBenefit(\AppBundle\Entity\Benefit $benefits)
{
$this->benefits[] = $benefits;
return $this;
}
/**
* Remove benefits
*
* @param \AppBundle\Entity\Benefit $benefits
*/
public function removeBenefit(\AppBundle\Entity\Benefit $benefits)
{
$this->benefits->removeElement($benefits);
}
/**
* Get benefits
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getBenefits()
{
return $this->benefits;
}
}
福利实体是:
/**
* @ORM\Entity(repositoryClass="AppBundle\Entity\BenefitRepository")
* @ORM\Table(name="benefits")
*/
class Benefit
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
// Other relevant fields
/**
* @ORM\ManyToOne(targetEntity="Project", inversedBy="benefits")
*/
protected $project;
在我的控制器中,我希望这样做:
$project = $em->getRepository('AppBundle:Project')->findOneById(3);
$benefit = new Benefit();
// set some fields for the new Benefit
$benefit->setProject($project);
$em->persist($benefit);
我希望将项目实体内的收益视为一个集合:
$benefits = $project->getBenefits();
但它没有用,所以我明确表示:
$project->addBenefit($benefit);
$em->persist($project);
$benefits = $project->getBenefits();
我确实在项目内的集合中看到了新创建的Benefit。问题是如果我重新运行这个并为同一个项目添加一个新的好处,我就得到最后一个。当然,如果在代码的相同部分我创建2个好处并添加两个,我有2个集合,但这不是我想要的。在福利方面,一切都很好:每个新福利都是持久的,所有这些福利都正确指向同一个项目。
我错过了什么?
编辑:
以下是我制作的步骤/我检查的内容:
数据库与当前实体元数据同步。 更新的Project实体是:
<?php
// src/AppBundle/Entity/Project.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProjectRepository")
* @ORM\Table(name="projects")
*/
class Project
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\oneToMany(targetEntity="Benefit", mappedBy="project", cascade="persist")
*/
protected $benefits;
/**
* Constructor
*/
public function __construct()
{
$this->benefits = new \Doctrine\Common\Collections\ArrayCollection();
}
// Other irrelevant fields
/**
* Add benefits
*
* @param \AppBundle\Entity\Benefit $benefit
* @return Project
*/
public function addBenefit(\AppBundle\Entity\Benefit $benefit)
{
$this->benefits[] = $benefit;
$benefit->setProject($this);
return $this;
}
/**
* Remove benefits
*
* @param \AppBundle\Entity\Benefit $benefits
*/
public function removeBenefit(\AppBundle\Entity\Benefit $benefits)
{
$this->benefits->removeElement($benefits);
}
/**
* Get benefits
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getBenefits()
{
return $this->benefits;
}
}
请注意,removeBenefit可能没有正确实现,但目前它并不相关。
我清理福利表。
我创建了一个新的好处并附加到项目:
$em = $this->getDoctrine()->getManager();
$project = $em->getRepository('AppBundle:Project')->findOneById(3);
$benefit = new Benefit();
$benefit->setName('Name of the benefit');
// here I set other irrelevant fields
$project->addBenefit($benefit);
$em->persist($project);
$em->flush();
福利保存适当地持久保存到数据库。它正确链接到项目:
然后我评论控制器中的所有代码并执行:
$em = $this->getDoctrine()->getManager();
$project = $em->getRepository('AppBundle:Project')->findOneById(3);
$benefits = $project->getBenefits();
return $this->render('testBenefits.html.twig', array(
'benefits' => $benefits, 'project' => $project));
如果我转储$ project我得到:
当然,如果我转储$ good,我会得到这个:
答案 0 :(得分:0)
您没有在福利课程中设置项目。
public function addBenefit(\AppBundle\Entity\Benefit $benefit)
{
$this->benefits[] = $benefit;
$benefit->setProject($this); // Add this
return $this;
}
注意到我也将你的论点从福利改为福利,因为addBenefit一次处理一个福利对象。