Symfony2 Doctrine2 ManyToMany复合键引用的列名称不存在

时间:2013-12-16 21:40:56

标签: symfony doctrine-orm mapping many-to-many composite-primary-key

我在背面有一个与复合键的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;
}

我尝试更换keywordattribut @joinColumn行,但我在attribut而不是keyword时收到了相同的错误消息。

我看不出我的映射有什么问题。表技能存在且包含名为keywordattribut的列。

我希望有人会看到我犯了错误的地方(可能是丢失的字符错误或错误的错误)。

2 个答案:

答案 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)

您写道,您希望StudentSkill建立多对多关系,但您将其与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;