Symfony2 Doctrine2 多对多关系复合主键列名不存在引用

4
我在反向方面使用具有复合键的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.

我有一个实体学生(唯一键),与一个实体技能(复合键)具有多对多关系,该实体技能与技能类型(唯一键)具有多对一关系。
以下是我拥有的不同类映射:
类 学生
<?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;
}

类别技能类型

<?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;
}

我尝试交换keywordattribut的@joinColumn行,但我得到了与keyword相同的错误消息,而不是attribut
我看不出我的映射有什么问题。表skill存在,并且具有名为keywordattribut的列。
我希望有人能看到我犯了什么错误(可能是拼写错误,如缺少字符或大小写错误)。
2个回答

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;

3
你写道你想让StudentSkill建立多对多关系,但你却将其与SkillType连接起来。你缺少inverseJoinColumns属性,并且没有正确引用Student
请尝试以下注释(未经测试,根据文档):
/**
 * @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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接