所以我想创建两个实体并进行多对多引用。我很想在一个表上使用字符串主键进行此关联。这似乎真的很难,至少我花了很多时间尝试没有任何结果。
这是我的方法:
第一个实体:
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'.
我想念什么?
答案 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;
我在编写问题时只考虑过这个问题。从头开始再次思考这个问题是个好方法。
干杯