选择与其他两个实体关联的实体,在Doctrine2中连接三个表

时间:2012-07-08 06:49:34

标签: php doctrine-orm doctrine-query

我有三种类型的实体,

  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;
    

    现在,如果我想让“管理员”中的所有用户都与“Google”网站相关联,我该怎么办?

    如果我使用TSQL,我会加入这三个表,我如何在Doctrine中这样做?

    我必须使用DQL吗? DQL怎么样?

1 个答案:

答案 0 :(得分: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行代码应该返回组和网站,而不是用户