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

Php 选择与其他两个实体关联的实体,连接Doctrine2中的三个表,php,doctrine-orm,doctrine-query,Php,Doctrine Orm,Doctrine Query,我有三种类型的实体 使用者 团体 网站 用户可以拥有网站,也可以属于群组 每个实体都有一个名称 以下是我的Doctrine2定义: <?php /** @Entity */ class User { // ... /** * @Column(type="string",length=255,nullable=false) * @var string */ protected $name; /** * @ManyT

我有三种类型的实体

  • 使用者
  • 团体
  • 网站
  • 用户可以拥有网站,也可以属于群组 每个实体都有一个名称

    以下是我的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;
    
        // ...
    }
    
    我还可以通过以下操作获取与网站“Google.com”相关的所有用户:

    $websites = $em->getRepository("Website")->findOneByName("Google.com");
    $users = $websites->users;
    
    现在,如果我想获得所有在“管理员”中的用户,以及与“谷歌”网站相关的用户,我能做什么

    如果我使用的是TSQL,我会加入这三个表,在理论中我该怎么做


    我必须使用DQL吗?DQL看起来是什么样子?

    您应该使用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文档:


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

    谢谢,我更正了我的代码,您的代码遗漏了两个where子句之间的and,但是在更正之后它就工作了
    $dql = '...'; // What i've written above
    $query = $em->createQuery($dql);
    $query->setParameter('group_name', 'Admins');
    $query->setParameter('website_name', 'Google');
    
    $users = $query->getResult();