Doctrine と Symfony2 で多対多の関係がどのように機能するかを理解しようとしています。
公式ドキュメント (goo.gl/GYcVE0) に示されている例を再作成し、2 つのエンティティ クラスを作成しました。ユーザーそしてグループ下記の通りです。
<?php
/** @Entity **/
class User
{
// ...
/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups")
**/
private $groups;
public function __construct() {
$this->groups = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
/** @Entity **/
class Group
{
// ...
/**
* @ManyToMany(targetEntity="User", mappedBy="groups")
**/
private $users;
public function __construct() {
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
DB を更新すると、次の MySQL スキーマが取得されます。
CREATE TABLE User (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE users_groups (
user_id INT NOT NULL,
group_id INT NOT NULL,
PRIMARY KEY(user_id, group_id)
) ENGINE = InnoDB;
CREATE TABLE Group (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE users_groups ADD FOREIGN KEY (user_id) REFERENCES User(id);
ALTER TABLE users_groups ADD FOREIGN KEY (group_id) REFERENCES Group(id);
問題は、Symfony2では実在物users_group
クエリを生成しますが、この場合は、このテーブルはフレームワークによって自動的に作成されるため、テーブルに関連付けられたエンティティはありません。
では、この関係テーブルに関連する情報を取得するにはどうすればよいでしょうか。たとえば、テーブルに表示される ID を持つグループ内のすべてのユーザーを取得する必要がありますusers_group
。
DQL、QueryBuilder、またはその他の方法を使用してこれを実行するにはどうすればよいですか?
どうもありがとう。
ベストアンサー1
結合DQLクエリは以下のように記述できます。
$em = $this->getContainer()->get('doctrine')->getManager();
$repository = $em->getRepository('YourNamespaceYourBundle:User');
$query = $repository->createQueryBuilder('u')
->innerJoin('u.groups', 'g')
->where('g.id = :group_id')
->setParameter('group_id', 5)
->getQuery()->getResult();
groups
エンティティ内のプロパティのマッピングはUser
結合部分自体を処理するため、DQLクエリでジャンクションテーブルを指定する必要はありません。