1

私には3つのタイプのエンティティがあります。

  1. ユーザー
  2. グループ
  3. ウェブサイト

ユーザーはWebサイトを持つことができ、グループに属することもできます。これらの各エンティティにも名前があります。

これが私のDoctrine2の定義です:

<?php
/** @Entity */
class User
{
    // ...


    /**
     * @Column(type="string",length=255,nullable=false)
     * @var string
     */
    protected $name;

    /**
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     * @JoinTable(name="users_groups")
     */
    private $groups;

    /**
     * @ManyToMany(targetEntity="Website", inversedBy="users")
     * @JoinTable(name="users_websites")
     */
    private $websites;

    // ...
}

/** @Entity */
class Group
{
    // ...

    /**
     * @Column(type="string",length=255,nullable=false)
     * @var string
     */
    protected $name;

    /**
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     */
    private $users;



    // ...
}

/** @Entity */
class Website
{
    // ...

    /**
     * @Column(type="string",length=255,nullable=false)
     * @var string
     */
    protected $name;

    /**
     * @ManyToMany(targetEntity="User", mappedBy="websites")
     */
    private $users;

    // ...
}

したがって、「Admins」というグループ内のすべてのユーザーを検索する場合は、次のように実行できます。

$group = $em->getRepository("Group")->findOneByName("Admins");
$users = $group->users;

また、次の方法で、ウェブサイト「Google.com」に関連付けられているすべてのユーザーを取得できます。

$websites = $em->getRepository("Website")->findOneByName("Google.com");
$users = $websites->users;

「管理者」に所属し、ウェブサイト「Google」にも関連付けられているすべてのユーザーを取得したい場合、どうすればよいですか?

TSQLを使用している場合、3つのテーブルを結合しますが、Doctrineでそれを行うにはどうすればよいですか?

DQLを使用する必要がありますか?DQLはどのように見えますか?

4

1 に答える 1

2

これにはDQLを使用する必要があります。

SELECT u
FROM User u
JOIN u.groups g
JOIN u.websites w
WHERE
    g.name = :group_name
    AND w.name = :website_name

そしてそうするためのphpコード:

$dql = '...'; // What i've written above
$query = $em->createQuery($dql);
$query->setParameter('group_name', 'Admins');
$query->setParameter('website_name', 'Google');

$users = $query->getResult();

教義のORMDQLドキュメントを読むことをお勧めします:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

PS:あなたが書いた2行のコードは、ユーザーではなく、グループとWebサイトを返す必要があります

于 2012-07-08T11:08:03.453 に答える