在 Doctrine 中,我是否需要创建一个 class 才能进行连接?
In Doctrine, do I need do create a class only to make a join?
我正在尝试加入我的存储库 class(Symfony 3 with Doctrine)。
这是它的样子:
public function findByRole($roles){
$qb = $this->createQueryBuilder('u')
->join('user_role', 'ur', Join::ON, 'ur.id = u.customerId');
$q = $qb->getQuery();
$users = $q->getArrayResult();
dump($users);
}
我遇到了这个错误:
[Semantical Error] line 0, col 49 near 'user_role ur': Error: Class
'user_role' is not defined.
定义了两个实体 class - 用户和角色。 Role 是 属性 的 User (ManyToMany)。
还有一个加入 table - user_role - 我是否需要为每个加入 table 创建一个 class 即使我不需要它我自己的目的?
p.s。
我知道这个错误可以在 Whosebug 上找到,但是遇到这个问题的人可能有不同的问题。
更新:
这是用户实体 class(缩写):
/**
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements AdvancedUserInterface, \Serializable {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
//irrelevant code removed
/**
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Role", cascade = {"persist"}, inversedBy="users")
* @ORM\JoinTable(name="user_role",
* joinColumns={@ORM\JoinColumn(name="user_id",
* referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id",
* referencedColumnName="id")}
* )
*/
private $roles;
//////////////////////////////////////////////////////////////////////
public function __construct() {
$this->roles = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}
////////////////////////////////
//roles
/**
* Add role
* @param \AppBundle\Entity\Role $role
*
* @return User
*/
public function addRole(\AppBundle\Entity\Role $role) {
$this->roles[] = $role;
return $this;
}
public function setRoles(\AppBundle\Entity\Role $role){
$this->addRole($role);
return $this;
}
/**
* Remove role
* @param \AppBundle\Entity\Role $role
*/
public function removeRole(\AppBundle\Entity\Role $role) {
$this->roles->removeElement($role);
}
/**
* I know it probably should return simply $this->roles, but the interface I'm implementing requires an array of strings... But everything works fine, except joining user+roles
* @return \Doctrine\Common\Collections\Collection
*/
public function getRoles() {
return $this->roles->toArray();
}
/**
* Get roles
* @return \Doctrine\Common\Collections\Collection
*/
public function getRoleEntities() {
return $this->roles;
}
}
我主义,所有连接的对象必须是实体。
但是您可以使用 user_role 作为链接 table
在实体 User 和 Role 之间映射多对多关系
在用户 table 中,您可能有一个 属性 $roles
/**
* @ManyToMany(targetEntity="Role", inversedBy="users")
* @JoinTable(name="user_role",
* joinColumns={@JoinColumn(name="user_id",
* referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="role_id",
* referencedColumnName="id")}
* )
*/
private $roles;
和 属性 $users
角色 table
/**
* @ManyToMany(targetEntity="User", inversedBy="roles")
* @JoinTable(name="user_role",
* joinColumns={@JoinColumn(name="role_id",
* referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="user_id",
* referencedColumnName="id")}
* )
*/
private $users;
我没有测试过这段代码。当然它需要一些tweeking。
您还需要为这些属性创建 getter 和 setter。
我正在尝试加入我的存储库 class(Symfony 3 with Doctrine)。
这是它的样子:
public function findByRole($roles){
$qb = $this->createQueryBuilder('u')
->join('user_role', 'ur', Join::ON, 'ur.id = u.customerId');
$q = $qb->getQuery();
$users = $q->getArrayResult();
dump($users);
}
我遇到了这个错误:
[Semantical Error] line 0, col 49 near 'user_role ur': Error: Class 'user_role' is not defined.
定义了两个实体 class - 用户和角色。 Role 是 属性 的 User (ManyToMany)。
还有一个加入 table - user_role - 我是否需要为每个加入 table 创建一个 class 即使我不需要它我自己的目的?
p.s。 我知道这个错误可以在 Whosebug 上找到,但是遇到这个问题的人可能有不同的问题。
更新:
这是用户实体 class(缩写):
/**
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements AdvancedUserInterface, \Serializable {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
//irrelevant code removed
/**
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Role", cascade = {"persist"}, inversedBy="users")
* @ORM\JoinTable(name="user_role",
* joinColumns={@ORM\JoinColumn(name="user_id",
* referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id",
* referencedColumnName="id")}
* )
*/
private $roles;
//////////////////////////////////////////////////////////////////////
public function __construct() {
$this->roles = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}
////////////////////////////////
//roles
/**
* Add role
* @param \AppBundle\Entity\Role $role
*
* @return User
*/
public function addRole(\AppBundle\Entity\Role $role) {
$this->roles[] = $role;
return $this;
}
public function setRoles(\AppBundle\Entity\Role $role){
$this->addRole($role);
return $this;
}
/**
* Remove role
* @param \AppBundle\Entity\Role $role
*/
public function removeRole(\AppBundle\Entity\Role $role) {
$this->roles->removeElement($role);
}
/**
* I know it probably should return simply $this->roles, but the interface I'm implementing requires an array of strings... But everything works fine, except joining user+roles
* @return \Doctrine\Common\Collections\Collection
*/
public function getRoles() {
return $this->roles->toArray();
}
/**
* Get roles
* @return \Doctrine\Common\Collections\Collection
*/
public function getRoleEntities() {
return $this->roles;
}
}
我主义,所有连接的对象必须是实体。
但是您可以使用 user_role 作为链接 table
在实体 User 和 Role 之间映射多对多关系在用户 table 中,您可能有一个 属性 $roles
/**
* @ManyToMany(targetEntity="Role", inversedBy="users")
* @JoinTable(name="user_role",
* joinColumns={@JoinColumn(name="user_id",
* referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="role_id",
* referencedColumnName="id")}
* )
*/
private $roles;
和 属性 $users
角色 table
/**
* @ManyToMany(targetEntity="User", inversedBy="roles")
* @JoinTable(name="user_role",
* joinColumns={@JoinColumn(name="role_id",
* referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="user_id",
* referencedColumnName="id")}
* )
*/
private $users;
我没有测试过这段代码。当然它需要一些tweeking。 您还需要为这些属性创建 getter 和 setter。