我编辑线程以获取更多信息。
我有“用户”实体和“Rol”实体,我正在努力完成用户角色的收集工作。
在我定义的用户实体中:
/**
* @ManyToMany(targetEntity="AppsManantiales\CommonBundle\Entity\Perfil")
* @JoinTable(name="usuarios_perfiles",
* joinColumns={@JoinColumn(name="idUsuario", referencedColumnName="idusuario")},
* inverseJoinColumns={@JoinColumn(name="idPerfil", referencedColumnName="idperfil")}
* )
*/
protected $perfiles;
在构造函数中:
public function __construct(){
$this->perfiles = new \Doctrine\Common\Collections\ArrayCollection();
$this->contacto = new \Doctrine\Common\Collections\ArrayCollection();
}
在类命名空间之前:
use AppsManantiales\CommonBundle\Entity\Perfil;
执行时:
php app/console generate:doctrine:entities CommonBundle
出现错误:
[Doctrine\Common\Annotations\AnnotationException]
[Semantical Error] The annotation "@ManyToMany" in property AppsManantiales\CommonBundle\Entity\Usuario::$perfiles was never impo
rted. Did you maybe forget to add a "use" statement for this annotation?
任何想法?。
答案 0 :(得分:0)
第一部分:所以在这种情况下,你在Role
实体和User
实体之间得到了多对多的关系。首先,检查,r实体在生成后是否正确。在这里,你可以找到建立不同现实的例子:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html&& http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html(第二个包含更多有关Doctrine查询示例的信息)
你的问题的第二部分:在建立正确的关系后,选择你的User
的查询会像:
$user = $em->createQueryBuilder()
->select('u, r')
->from('YourBundle:User', 'u')
->innerJoin('u.roles', 'r')
->where('u.id IN (:ids)')
->setParameter('ids', $ids)
->getQuery()
->getResult();
正如您猜测的那样,您可以在访问者的帮助下获得角色:$user->getRoles()
P.S。是的,ofcource如果所有实体都正确,你可以手动添加方法。
<强> EDITED 强>
哦,sry,我忘记了,你使用Symfony2
。因此,默认情况下,您的实体中有这样一行:
use Doctrine\ORM\Mapping as ORM;
您可以注意到,您使用的所有注释都带有前缀@ORM\
。 exmpls:
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
所以只需添加前缀@ORM
和结果:
/**
* @ORM\ManyToMany(targetEntity="AppsManantiales\CommonBundle\Entity\Perfil")
* @ORM\JoinTable(name="usuarios_perfiles",
* joinColumns={@ORM\JoinColumn(name="idUsuario", referencedColumnName="idusuario")},
* inverseJoinColumns={@ORM\JoinColumn(name="idPerfil", referencedColumnName="idperfil")}
* )
*/