我在背面有一个与复合键的ManyToMany关系。 当我使用控制台命令doctrine:schema:update时出现以下错误:
[Doctrine\ORM\ORMException]
Column name `keyword` referenced for relation from Map\MapBundle\Entity\
Student towards Map\MapBundle\Entity\SkillType does not exist.
我有一个实体学生(唯一键),与实体技能(复合键)具有ManyToMany关系,与skillType(唯一键)具有ManyToOne关系。
以下是我的不同类映射:
班级学生
<?php
namespace Map\MapBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Student
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Map\MapBundle\Entity\StudentRepository")
*/
class Student {
/**
*
* @var integer @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity="Map\MapBundle\Entity\SkillType")
* @ORM\JoinTable(name="students_skills",
* joinColumns={
* @ORM\JoinColumn(name="keyword", referencedColumnName="keyword"),
* @ORM\JoinColumn(name="attribut", referencedColumnName="attribut")
* })
*/
private $skills;
}
班级技能
<?php
namespace Map\MapBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Skill
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Map\MapBundle\Entity\SkillRepository")
*/
class Skill {
/**
* @ORM\ManyToOne(targetEntity="Map\MapBundle\Entity\skillType")
* @ORM\JoinColumn(name="keyword", referencedColumnName="keyword")
* @ORM\Id
*/
private $keyword;
}
Classe skillType
<?php
namespace Map\MapBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* SkillType
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Map\MapBundle\Entity\SkillTypeRepository")
*/
class SkillType {
/**
* @var string
*
* @ORM\Column(name="keyword", type="string", length=255)
* @ORM\Id
*/
private $keyword;
}
我尝试更换keyword
和attribut
@joinColumn行,但我在attribut
而不是keyword
时收到了相同的错误消息。
我看不出我的映射有什么问题。表技能存在且包含名为keyword
和attribut
的列。
我希望有人会看到我犯了错误的地方(可能是丢失的字符错误或错误的错误)。
答案 0 :(得分:5)
感谢您的回答。它帮助了我很多,我成功地进行了架构更新。
以下是我最终使用的代码
/**
* @ORM\ManyToMany(targetEntity="Carte\CarteBundle\Entity\Skill")
* @ORM\JoinTable(name="students_skills",
* joinColumns={@ORM\JoinColumn(name="student_id", referencedColumnName="id")},
* inverseJoinColumns={
* @ORM\JoinColumn(name="keyword", referencedColumnName="keyword"),
* @ORM\JoinColumn(name="attribut", referencedColumnName="attribut")
* })
*/
private $skills;
答案 1 :(得分:3)
您写道,您希望Student
与Skill
建立多对多关系,但您将其与SkillType
相关联。并且您错过了inverseJoinColumns
属性,但未正确引用Student
。
尝试以下注释(未经测试,查看documentation后):
/**
* @ORM\ManyToMany(targetEntity="Map\MapBundle\Entity\Skill")
* @ORM\JoinTable(name="students_skills",
* joinColumns={@ORM\JoinColumn(name="student_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="skill_keyword", referencedColumnName="keyword")}
* )
*/
private $skills;