使用非" id"的多对多关系主义的主要关键

时间:2016-05-23 15:00:47

标签: doctrine

所以我想创建两个实体并进行多对多引用。我很想在一个表上使用字符串主键进行此关联。这似乎真的很难,至少我花了很多时间尝试没有任何结果。

这是我的方法:

第一个实体:     

namespace Project\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="User")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $Id;

    /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="Users")
     * @ORM\JoinTable(name="role_user",
     * joinColumns={@ORM\JoinColumn(name="User_Id", referencedColumnName="Id")},
     * inverseJoinColumns={@ORM\JoinColumn(name="Role_Name", referencedColumnName="Name")}
     * )
     */
    private $Roles;
}

第二个:     

namespace Project\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="Role")
 */
class Role
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=256)
     */
    private $Name;

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="Roles")
     * @ORM\JoinTable(name="role_user",
     * joinColumns={@ORM\JoinColumn(name="Role_Name", referencedColumnName="Name")},
     * inverseJoinColumns={@ORM\JoinColumn(name="User_Id", referencedColumnName="Id")}
     * )
     */
    private $Users;
}

./app/console doctrine:schema:validate的输出:

[Mapping]  FAIL - The entity-class 'Project\AdminBundle\Entity\User' mapping is invalid:
* The referenced column name 'Id' has to be a primary key column on the target entity class 'Project\AdminBundle\Entity\User'.
* The referenced column name 'Id' has to be a primary key column on the target entity class 'Project\AdminBundle\Entity\Role'.

我想念什么?

1 个答案:

答案 0 :(得分:0)

注意大/小写! Doctrine默认情况下将其列生成为小写。这解决了这个问题:

 * joinColumns={@ORM\JoinColumn(name="User_Id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="Role_Name", referencedColumnName="name")}

这太复杂了;它足以将其放入Role实体:

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="Roles")
 * @ORM\JoinColumn(name="role_user", referencedColumnName="name")
 */
private $Users;

我在编写问题时只考虑过这个问题。从头开始再次思考这个问题是个好方法。

干杯