0

クエリ ビルダーを実行しようとしていますが、クエリが少し複雑なため、開始方法がわかりません。

SQL でのクエリは次のようになります。

SELECT email FROM AdminUsers WHERE id = (
    SELECT u_id FROM user_groups WHERE group_id = 'id_from_group_table'
);

テーブル ユーザー、テーブル グループ、および各行の user_id と group_id との関係を含む 3 番目のテーブルがあるため、3 つのテーブルをクエリしています。

Query Builder または DQL を使用してそれを実現するにはどうすればよいですか?

どうもありがとう!

4

2 に答える 2

0

そのようなものは動作するはずです(実際にはテストされていません)

$query = $em->createQuery('SELECT u.email FROM AdminUsers u WHERE EXISTS (SELECT g.u_id FROM user_groups g WHERE g.group_id = ?1 AND u.id = g.u_id)')->setParameter(1, 321); //where 321 the id you are looking for

$emails = $query->getResult();

ドキュメント: http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html その他のドキュメント: http://docs.doctrine-project.org/en/2.1/reference/ dql-doctrine-query-language.html

サブクエリに関する小さなチュートリアル: http://www.philippoffmann.de/blog/2012/08/29/a-bulletproof-pattern-for-creating-doctrine-subqueries-of-any-complexity/

編集 クエリ本文の「?1」と最後の「setParameter()」メソッドに注意してください。これは、クエリにパラメーターを渡す方法であり、クエリビルダー、DQL、または SQL で構築されているかどうかは関係ありません。SQL インジェクションから保護されるので、常に実行してください。

于 2013-11-13T10:36:29.967 に答える
0

どのようにエンティティを構築しましたか? User エンティティと Group エンティティで ManyToMany 関係を使用する必要があります。これらのエンティティを比較的簡単にクエリできるよりも

ユーザー エンティティ

/**
 * @var Group
 *
 * @ORM\ManyToMany(targetEntity="Group", mappedBy="users")
 * @ORM\JoinTable(name="user_group",
 *   joinColumns={
 *     @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="group_id", referencedColumnName="id")
 *   }
 * )
 */
private $groups;

グループエンティティ

/**
 * @var User
 *
 * @ORM\ManyToMany(targetEntity="User", inversedBy="groups")
 */
private $users;

コンストラクターで $users 変数と $groups 変数を初期化することを忘れないでください

public function __construct
{
     $this->groups = new ArrayCollection();
}

これらのエンティティをクエリできるようになりました

コントローラーで

$this->getDoctrine()->getRepository('YourBundle:User')->FindByGroup($yourGroupId);

または、QueryBuilder を使用する場合

$q = $this->getDoctrine()->getRepository('YourBundle:User')
     ->createQueryBuilder('user')
     ->select('user.email')
     ->innerJoin('user.group', 'group')
     ->where('group.id = ?1')
     ->setParameter(1, $yourGroupId)

およびドキュメント: http://docs.doctrine-project.org/en/latest/reference/query-builder.html

于 2013-11-13T10:33:28.070 に答える