2016-08-08 14 views
0

データベースには、テーブルUser(idUser、name ...)とテーブルRole(IdRole、description ..)があります。 これらの2つの間に、リンクテーブルHasRole(idUser、idRole)があります。ManyToMany関係を持つQueryBuilderとエンティティ

Symfonyコマンドラインでエンティティを生成すると、HasRoleエンティティは生成されません。代わりに、私はロール・プロパティ上でこれを持っているユーザエンティティに:

* @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") 
* } 
*) 

私はUserRepositoryに1つのIDの役割のためのすべてのユーザーを返すメソッドを作成したいと思います。

それはすべきは次のように起動します:

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

uが助けることができますか?

のTy

答えて

1

あなたの多対多のテーブルを結合生成する教義を使用する場合は、確かにあなたがそのために実体を持っていません。

あなたの場合(あなたがそのテーブルの追加データが格納されるため、例えば)エンティティとして参加するテーブルを持っている必要があります、その後、あなたは次のように関係を作成する必要がありますが:

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

しかし、あなたの中に場合、それはちょうどそれからユーザーを希望IDと役割を取得し、取得するには十分です:あなたがあなたのケースにそれを採用することで作業できるように、私はあなたの例を与えている

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

。私はエンティティプロパティ/アノテーションの大部分を削除して、簡単に画像を取得できるようにしました。

以下の例では、Student(M)から(N)Subjectの関係があります。 M-Nを達成するには、Student(1)〜(N)StudentSubject(N)〜(1)Subjectを使用して、StudentSubjectエンティティに関係が保持されるようにします。

学生

class Student 
{ 
    protected $id; 

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

件名

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; 
} 

例クエリ:

このクエリは、学生と被験者のエンティティから指定されたフィールドのみを選択します。

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); 
    } 
} 
関連する問題