这是我发布到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
但是我无法弄清楚,它应该在Doctrine世界中看起来如何。 我试着这样做:
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 in C:\ WAMP \ WWW \交响乐团\供应商\原则\ ORM \ LIB \原则\ ORM \查询\ SqlWalker.php 第826行
我尝试了其他几种方法,但所有这些方法都让我遇到了不同的错误。那么如何正确地做到这一点?经过无数个小时的googel'ing,我还没想到它。
答案 0 :(得分:2)
您应该按变量名称而不是列名称来映射关联。
/**
* @var Doctrine\Common\Collections\ArrayCollection $login
* @ORM\OneToMany(targetEntity="Crm\AuthBundle\Entity\Login", mappedBy="employee")
*/
protected $login;
应该是employee
而不是employee_id
。
此外,您的反转注释未正确设置..它们应分别指向login
,phone
和email
。
inversedBy
和mappedBy
用于引用关联对面的变量。