2016-08-08 12 views
0

In der Datenbank habe ich eine Tabelle Benutzer (IDUser, Name ...) und eine Tabelle Rolle (IdRole, Beschreibung ..). Zwischen den beiden gibt es eine Verknüpfungstabelle HasRole (idUser, idRole).QueryBuilder und Entität mit ManyToMany-Beziehung

Beim Generieren der Entität mit der Symfony-Befehlszeile wird die HasRole-Entität nicht generiert. Stattdessen wird in der Benutzereinheit habe ich dies auf die Rolle Eigenschaft:

* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\ManyToMany(targetEntity="MyBundle\Entity\Role", inversedBy="utilisateur") 
* @ORM\JoinTable(name="hasrole", 
* joinColumns={ 
*  @ORM\JoinColumn(name="UTILISATEUR", referencedColumnName="ID") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="ROLE", referencedColumnName="ID") 
* } 
*) 

Ich möchte in der UserRepository ein Verfahren schaffen, die alle Benutzer für eine id Rolle zurückgibt.

sollten Sie beginnt wie folgt aus:

$qb = $this->getEntityManager()->createQueryBuilder() 
     ->select('utilisateur') 
     ->from('ACCUEILBundle:User', 'utilisateur'); 

u kann helfen?

Ty

Antwort

1

Wenn Sie Lehre verwenden Ihre ManyToMany Join-Tabelle zu generieren, dann in der Tat werden Sie nicht ein Unternehmen dafür.

Wenn Sie Notwendigkeit auf die Tabelle als Einheit verbinden (zum Beispiel, weil Sie in dieser Tabelle zusätzliche Daten speichern), dann sollten Sie Beziehung auf folgende Weise erstellen:

entityA <-OneToMany-> joinEntity <-ManyToOne-> entityB 

jedoch in Ihrem Fall sollte es genügen, nur die Rolle mit der gewünschten ID zu erhalten und erhält dann die Benutzer aus, dass:

$role = $entityManager->getRepository('Role')->find($id); 
$users = $role->getUsers(); //(or getUtilisatuers(), if I see correctly) 
0

ich Ihnen ein Beispiel gebe, so dass Sie daran arbeiten können es in Ihren Fall zu übernehmen. Ich habe die meisten Entity-Eigenschaften/Annotationen entfernt, um es für Sie einfach zu halten, das Bild zu erhalten.

Im Beispiel unten gibt es eine Subjektbeziehung zwischen Student (M) und (N). Um M-N zu erreichen, können Sie Student (1) zu (N) StudentSubject (N) zu (1) Subject, so dass die Beziehungen in StudentSubject-Entität gehalten werden.

Studenten

class Student 
{ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="StudentSubject", mappedBy="studentMap", cascade={"persist", "remove"}) 
    */ 
    protected $studentInverse; 
} 

Gegenstand

class Subject 
{ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="StudentSubject", mappedBy="subjectMap", cascade={"persist", "remove"}) 
    */ 
    protected $subjectInverse; 
} 

StudentSubject

/** 
* @ORM\Entity(repositoryClass="School\FrontendBundle\Repository\StudentSubjectRepository") 
*/ 
class StudentSubject 
{ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Student", inversedBy="studentInverse") 
    * @ORM\JoinColumn(name="student", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
    */ 
    protected $studentMap; 

    /** 
    * @ORM\ManyToOne(targetEntity="Subject", inversedBy="subjectInverse") 
    * @ORM\JoinColumn(name="subject", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
    */ 
    protected $subjectMap; 
} 

Beispielabfrage:

Diese Abfrage wählt nur die Felder aus den Entitäten Student und Subject aus.

class StudentSubjectRepository extends EntityRepository 
{ 
    public function findAll() 
    { 
     $fields = [ 
      'st.id AS stId', 
      'st.studentId AS stStId', 
      'sb.id AS sbId', 
      'sb.code AS sbCode', 
     ]; 

     return 
      $this 
       ->createQueryBuilder('ss') 
       ->select($fields) 
       ->join('ss.studentMap', 'st') 
       ->join('ss.subjectMap', 'sb') 
       ->addOrderBy('st.studentId', 'ASC') 
       ->addOrderBy('sb.code', 'ASC') 
       ->getQuery() 
       ->getResult(Query::HYDRATE_SCALAR); 
    } 
}