这是我发布到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
.
此外,您的反向注释未正确设置。它们应分别指向login
、phone
和email
。
inversedBy
和 mappedBy
旨在引用关联另一侧的变量。