web-dev-qa-db-ja.com

Symfony2でDoctrineを使用して多対多の関係を照会する

多対多の関係がDoctrineおよびSymfony2でどのように機能するかを理解しようとしています。

公式ドキュメント(goo.gl/GYcVE0)に示されている例を再作成しました。次の2つのエンティティクラスがあります:serおよびGroup

_<?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ではクエリを生成するためにEntityが必要であり、この場合、テーブル_users_group_に関連付けられたエンティティがないことです。このテーブルはフレームワークによって自動的に作成されるためです。

では、この関係テーブルに関連する情報を取得するにはどうすればよいですか?たとえば、テーブル_users_group_に表示されるIDを持つユーザーであるグループ内のすべてのユーザーを取得する必要があります。

DQL、QueryBuilder、またはその他のメソッドを使用してそれを行うにはどうすればよいですか?

どうもありがとう。

16
Ema.jar

以下のように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クエリでジャンクションテーブルに言及する必要のない結合部分自体を処理します

26
M Khalid Junaid