Symfony 2中的一对多关系与学说

时间:2013-06-19 08:18:07

标签: symfony orm doctrine-orm

我在Stack Overflow和网络上的其他地方看了很多问题/答案,但无法找到解决这个问题的方法。

在我解释这个问题之前,我有:

  • 剥离我的实体,以便它们只有最小的属性和方法
  • 已清除了doctrine查询缓存/元数据缓存
  • 删除并重新创建架构
  • 检查了我的拼写

我有以下两个实体:

<?php
namespace Docker\ApiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

  /**
   * @ORM\Column(type="integer")
   * @ORM\ManyToOne(targetEntity="Project",inversedBy="sources")
   * @ORM\JoinColumn(referencedColumnName="id")
   */
  private $project;

}


<?php
namespace Docker\ApiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

  /**
   * @ORM\OneToMany(targetEntity="Source", mappedBy="project")
   */
  private $sources;

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

  public function getSources() {
    return $this->sources;
  }
}

所以很多“来源”都属于一个“项目”。

在我的控制器中我有:

$em = $this->getDoctrine()->getManager();
$project = $em->find('Docker\ApiBundle\Entity\Project', 1);
$sources = $project->getSources()->toArray();

我尝试过很多东西,但我总是得到:

Notice: Undefined index: project in /.../www/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1577

就像我说的那样,我知道有很多问题要解决这个问题,但是没有一个可接受的答案可以解决我的问题。

这一切对于使用Doctrine2来说都非常重要,所以不确定我做错了什么 - 这可能是非常明显的事情。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

你有:

/**
* @ORM\Column(type="integer")
* @ORM\ManyToOne(targetEntity="Project",inversedBy="sources")
* @ORM\JoinColumn(referencedColumnName="id")
*/
private $project;

卸下:

@ORM\Column(type="integer")

来自注释。

答案 1 :(得分:1)

如果这正是您的代码,我在Project类中看不到命名空间。尝试添加命名空间行“namespace Docker \ ApiBundle \ Entity;”。 如果这是相同的文件夹,则不需要“使用”,但如果它是其他包或文件夹的一部分,请尝试添加一行,如“使用Docker \ ApiBundle \ Entity \ Project;” 在你的Source类中。我希望它有所帮助..

否则:

<?php
namespace Azimut\ApiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

  private $name;


  /**
   * @ORM\Column(type="integer")
   * @ORM\ManyToOne(targetEntity="Azimut\ApiBundle\Entity\Project", inversedBy="sources")
   * @ORM\JoinColumn(onDelete="CASCADE")
   */
  private $project;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set project
 *
 * @param integer $project
 * @return Source
 */
public function setProject($project)
{
    $this->project = $project;

    return $this;
}

/**
 * Get project
 *
 * @return integer 
 */
public function getProject()
{
    return $this->project;
}
}


<?php
namespace Azimut\ApiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

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

  /**
   * @ORM\OneToMany(targetEntity="Azimut\ApiBundle\Entity\Source", mappedBy="object", cascade={"all"})
   */
  private $sources;

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

  public function getSources() {
    return $this->sources;
  }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

/**
 * Add sources
 *
 * @param \Azimut\ApiBundle\Entity\Source $sources
 * @return Project
 */
public function addSource(\Azimut\ApiBundle\Entity\Source $sources)
{
    $this->sources[] = $sources;

    return $this;
}

/**
 * Remove sources
 *
 * @param \Azimut\ApiBundle\Entity\Source $sources
 */
public function removeSource(\Azimut\ApiBundle\Entity\Source $sources)
{
    $this->sources->removeElement($sources);
}
}

和控制器的一小部分:     公共函数helloAction()

{
        $id = 1;
        $em = $this->getDoctrine()->getManager();
        $project = $em->getRepository('Azimut\ApiBundle\Entity\Project')->find($id);

        $source1 = $em->getRepository('Azimut\ApiBundle\Entity\Source')->find(3);
        $source2 = $em->getRepository('Azimut\ApiBundle\Entity\Source')->find(5);
        $project->addSource($source1);
        $sources = array();
        $sources = $project->getSources();
        var_dump($sources);
        return ....
}

这对我来说很好。