学说多对多关系

时间:2013-10-26 02:49:00

标签: sql symfony doctrine many-to-many

我编辑线程以获取更多信息。

我有“用户”实体和“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? 

任何想法?。

1 个答案:

答案 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")}
 * )
 */