3

我已经在 Stack Overflow 和网络上的其他地方查看了大量的问题/答案,但找不到解决这个问题的方法。

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

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

我有以下两个实体:

<?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 来说非常基础,所以不确定我做错了什么——这可能是非常明显的事情。

任何帮助,将不胜感激。

4

2 回答 2

5

你有:

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

消除:

@ORM\Column(type="integer")

从注释。

于 2013-06-19T12:18:50.543 回答
1

如果这正是您的代码,我在您的 Project 类中看不到命名空间。尝试添加命名空间行“命名空间 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 ....
}

这对我来说很好。

于 2013-06-19T08:44:25.837 回答