Symfony2多对一 - 一对多没有连接表

时间:2015-04-12 14:00:58

标签: symfony doctrine-orm one-to-many many-to-one

我有“项目”实体,可以有多种福利,而福利只属于一个项目: 对我而言似乎是一对多 - 一对多的关系。 我按照指示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();

福利保存适当地持久保存到数据库。它正确链接到项目:

enter image description here

然后我评论控制器中的所有代码并执行:

$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我得到:

enter image description here

当然,如果我转储$ good,我会得到这个:

enter image description here

1 个答案:

答案 0 :(得分:0)

您没有在福利课程中设置项目。

public function addBenefit(\AppBundle\Entity\Benefit $benefit)
{
    $this->benefits[] = $benefit;
    $benefit->setProject($this);  // Add this
    return $this;
}

注意到我也将你的论点从福利改为福利,因为addBenefit一次处理一个福利对象。