Doctrine Class“.. \ ..”没有名为“......”的关联

时间:2011-08-01 13:47:26

标签: orm doctrine relation

我希望你能帮我解决这个问题,因为我真的看不出这里有什么问题。

我有2个实体: RokZaPrijavuProjekta Predmet

RokZaPrijavuProjekta:

/**
* @ORM\Table(name="rok_prijava_projekta")
* @ORM\Entity(repositoryClass="JP\AdminBundle\Repository\RokZaPrijavuProjektaRepository")
*/
class RokZaPrijavuProjekta
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer $id_predmet
 * @ORM\ManyToOne(targetEntity="Predmet")
 * @ORM\Column(name="id_predmet", type="integer")
 */
private $predmet;

/**
 * @var date $od
 * @ORM\Column(name="od", type="date")
 */
private $od;

/**
 * @var date $do
 * @ORM\Column(name="do", type="date")
 */
private $do;

/**
 * @var string $info
 * @ORM\Column(name="info", type="string", length=120)
 */
private $info;
}

Predmet实体代码:

/**
 * @ORM\Table(name="predmeti")
 * @ORM\Entity(repositoryClass="JP\AdminBundle\Repository\PredmetRepository")
 */
class Predmet
{
/**
 * @var integer $id
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string $sifra
 * @ORM\Column(name="sifra", type="string", length=64)
 */
private $sifra;

/**
 * @var boolean $vidljiv
 * @ORM\Column(name="vidljiv", type="boolean")
 */
private $vidljiv;
}

存储库方法:

$q = $this->createQueryBuilder('r')
->select('rzpp')
->where('rzpp.predmet = :predmet')
->from('JPAdminBundle:RokZaPrijavuProjekta', 'rzpp')
->leftJoin("rzpp.predmet", "p")
->setParameter('predmet', $predmet)
->getQuery();

正确定义了所有类成员的getter和setter。

现在,“RokZaPrijavuProjekta”有一个外键引用“Predmet”,因此很多这些“RokZaPrijavuProjekta”可以拥有相同的“Predmet”。

我想为此目的创建单向ManyToOne关系,但不断抛出异常:

  

Class JP \ AdminBundle \ Entity \ RokZaPrijavuProjekta没有名为predmet的关联

我去了Doctrine documentation,但发现这是定义单向多对一关系的首选方式。

你知道这里有什么问题吗?


更新

  • 添加了Predmet实体代码......
  • 添加了存储库方法

非常感谢!

此致 约万

3 个答案:

答案 0 :(得分:26)

嗯,昨晚我又遇到了同样的问题。这次我花了一些时间弄清楚为什么它上次突然开始工作(在我上面的问题时)。

因此,问题的底线和解决方案

在我的实体类中,我有@Column@ManyToOne注释,其中我使用@Column来定义数据库中列的名称,并使用@ManyToOne来定义关系。关键是您需要删除 @Column注释并将其替换为@JoinColumn,从而定义namereferencedColumnName属性。检查这些片段:

这不起作用:

(有或没有@JoinColumn

/**
 * @var integer $file
 * @ORM\Column("name="id_file", type="integer")
 * @ORM\ManyToOne(targetEntity="File")
 */
private $file

/**
 * @var integer $file
 * @ORM\ManyToOne(targetEntity="File")
 * @ORM\JoinColumn(name="id_file", referencedColumnName="id")
 */
private $file

我希望这会对某人有所帮助......

干杯!

答案 1 :(得分:1)

你能展示Predmet实体代码吗?

或者只是试试这段代码:

// RokZaPrijavuProjekta
/**
 * @ORM\ManyToOne(targetEntity="Predmet", inversedBy="rokzaprojects")
 */
protected $predmet;


//Predmet
/**
 * @ORM\OneToMany(targetEntity="RokZaPrijavuProjekta", mappedBy="predmet")
 */
protected $rokzaprojects;

答案 2 :(得分:1)

其他信息,评论的格式很重要

我浪费了几个小时才发现我错过了评论中的星号标记

这不起作用

/*
 * @ORM\OneToMany(targetEntity="\Custom\Models\ProductText", mappedBy="product", orphanRemoval=true, cascade={"persist","remove"})
 */
protected $texts;

然而这是有效的

/**
 * @ORM\OneToMany(targetEntity="\Custom\Models\ProductText", mappedBy="product", orphanRemoval=true, cascade={"persist","remove"})
 */
protected $texts;

注意第一个例子第一行的缺失星号(*)