1

我有三种类型的实体,

  1. 用户
  2. 团体
  3. 网站

用户可以有网站,他们也可以属于组这些实体中的每一个也有一个名称。

这是我的 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;

现在,如果我想获取“Admins”中的所有用户,并且还与“Google”网站相关联,我该怎么办?

如果我使用 TSQL,我会加入这三个表,我该如何在 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();

我鼓励您阅读 ORM DQL 教义文档:http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

PS:您编写的 2 行代码应该返回组和网站,而不是用户

于 2012-07-08T11:08:03.453 回答