我希望你能帮我解决这个问题,因为我真的看不出这里有什么问题。
我有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,但发现这是定义单向多对一关系的首选方式。
你知道这里有什么问题吗?
非常感谢!
此致 约万
答案 0 :(得分:26)
因此,问题的底线和解决方案:
在我的实体类中,我有@Column
和@ManyToOne
注释,其中我使用@Column
来定义数据库中列的名称,并使用@ManyToOne
来定义关系。关键是您需要删除 @Column
注释并将其替换为@JoinColumn
,从而定义name
和referencedColumnName
属性。检查这些片段:
(有或没有@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;
注意第一个例子第一行的缺失星号(*)