加入Symfony和Doctrine中的四个表格


JOIN over four tables in Symfony and Doctrine

这是我发布到Symfony论坛的问题,但由于它没有从那里得到任何反馈,让我们在这里尝试:)

我有四个实体:AdminBundle:Employee,AuthBundle:Login,AdminBundle:Employeephone和AdminBundle:EmployeeEmail。

当然,它们彼此之间有关联:

员工实体

/**
* @var Doctrine'Common'Collections'ArrayCollection $login
* @ORM'OneToMany(targetEntity="Crm'AuthBundle'Entity'Login", mappedBy="employee_id", cascade={"persist"})
*/
protected $login;
/**
* @var Doctrine'Common'Collections'ArrayCollection $phone
* @ORM'OneToMany(targetEntity="Crm'AdminBundle'Entity'EmployeePhone", mappedBy="employee_id", cascade={"persist"})
*/
protected $phone;
/**
* @var Doctrine'Common'Collections'ArrayCollection $email
* @ORM'OneToMany(targetEntity="Crm'AdminBundle'Entity'EmployeeEmail", mappedBy="employee_id", cascade={"persist"})
*/
protected $email;

登录实体

/**
* @ORM'ManyToOne(targetEntity="Crm'AdminBundle'Entity'Employee", inversedBy="login", cascade={"persist"})
* @ORM'JoinColumn(name="employee_id", referencedColumnName="id") 
*/
protected $employee;

电话实体

/**
* @ORM'ManyToOne(targetEntity="Crm'AdminBundle'Entity'Employee", inversedBy="login", cascade={"persist"})
* @ORM'JoinColumn(name="employee_id", referencedColumnName="id")
*/
private $employee;

电子邮件实体

/**
* @ORM'ManyToOne(targetEntity="Crm'AdminBundle'Entity'Employee", inversedBy="login", cascade={"persist"})
* @ORM'JoinColumn(name="employee_id", referencedColumnName="id")
*/
private $employee;
现在我想运行查询,获取所有用户及其主要电话和电子邮件

的列表(只有一个是主要电话和电子邮件),在SQL中,我会像这样编写此查询:

SELECT * FROM `login`
LEFT JOIN `employee` on `login`.`employee_id` = `employee`.`id`
LEFT JOIN `employeephone` on `employee`.`id` = `employeephone`.`employee_id`
LEFT JOIN `employeeemail` on `employee`.`id` = `employeeemail`.`employee_id`
WHERE `employeephone`.`is_primary`=1 
AND `employeeemail`.`is_primary`=1

但是我不知道,它在教义世界中应该是什么样子。我尝试这样做:

class EmployeeRepository extends EntityRepository {
    public function getAllEmployees() {
        $dql = "SELECT e, l, p, m FROM AuthBundle:Login l
                JOIN l.employee e
                JOIN e.phone p  
                JOIN e.email m";
        $query = $this->getEntityManager()->createQuery($dql);
        try {
            return $query->getArrayResult();
        } catch (DoctrineORMNoResultException $e) {
            return null;
        }
    }
}

但它给了我一点点不好的错误:

注意:未定义的索引:employee_id C:''wamp''www''Symphony''vendor''doctrine''orm''lib''Doctrine''ORM''Query''SqlWalker.php 826路

尝试了其他几种方法,但所有这些方法都会导致我出现不同的错误。那么如何正确地做到这一点呢?经过无休止的咕噜咕噜,我还没有弄清楚。

应按变量名称而不是列的名称映射关联。

/**
 * @var Doctrine'Common'Collections'ArrayCollection $login
 * @ORM'OneToMany(targetEntity="Crm'AuthBundle'Entity'Login", mappedBy="employee")
 */
 protected $login;

它应该是employee的,而不是employee_id.

此外,您的反向注释未正确设置。它们应分别指向loginphoneemail

inversedBymappedBy 旨在引用关联另一侧的变量。