这是我在 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;
}
}
}
但这给了我一点不错的错误:
注意:未定义索引:C:\wamp\www\Symphony\vendor\doctrine\orm\lib\Doctrine\ORM\Query\SqlWalker.php 第 826 行中的employee_id
我尝试了其他几种方法,但它们都导致我出现不同的错误。那么如何正确地做到这一点呢?经过无数小时的googel'ing,我还没有弄清楚。