2016-02-27 111 views
2

3个表之间一对多的关系选择字段我有用户实体:许多在教义和ZF2与查询生成器

class User{ 
... 

/** 
* @var Module $modules 
* @ORM\ManyToMany(targetEntity="Adm\Entity\Module", inversedBy="users", cascade={"persist"}) 
* @ORM\JoinTable(
* name="user_module", 
* joinColumns={@ORM\JoinColumn(name="module_id", referencedColumnName="id")}, 
* inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")} 
*) 
*/ 
protected $modules; 

public function __construct() { 
    $this->modules = new \Doctrine\Common\Collections\ArrayCollection(); 
} 
... 
} 

和模块实体:

class Module{ 
... 
/** 
* @ORM\ManyToMany(targetEntity="Adm\Entity\User", mappedBy="modules") 
*/ 
protected $users; 
... 
} 

我有三个表:用户,模块和user_module(用户和模块之间的关系,没有额外的字段)。 我试图建立一个查询来获取用户(用于$ id)和模块相关的他,这些关系是在user_module表中。这是我做过什么:

public function getUser($id){ 
     $qb = $this->getEm()->createQueryBuilder() 
     ->select('u', 'm') 
     ->from('Adm\Entity\User', 'u') 
     ->join('u.modules', 'm') 
     ->where('u.id = ?1') 
     ->setParameter(1, $id) 
     ->setMaxResults(1); 
     $result = $qb->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY); 
     return $result; 
    } 

但不与用户,它只是把从模块表,它具有相同的ID用户1倍的结果使相关模块。 请帮我建立这个查询。谢谢!

+0

尝试取出 - > setMaxResults(1) – Garry

+0

由于@Garry,去除该线和也我被反转连接列注释: '* joinColumns = {@ ORM \ JoinColumn(名称= “模块id”,referencedColumnName =” id =“ * inverseJoinColumns = {@ ORM \ JoinColumn(name =”user_id“,referencedColumnName =”id“)}' 它必须是这样: '* joinColumns = {@ ORM \ JoinColumn(name = “user_id”,referencedColumnName =“id”)}, * inverseJoinColumns = {@ ORM \ JoinColumn(name =“module_id”,referencedColumnName =“id”)} –

回答

0

我意识到,我倒相连接列声明:

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

它必须是:

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

还有,我不得不在我的函数删除此声明,感谢@Garry将它指向我:

->setMaxResults(1) 

现在它按预期工作。