1

这是我在 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,我还没有弄清楚。

4

1 回答 1

2

您应该通过变量的名称而不是列的名称来映射关联。

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

它应该是employee而不是employee_id

此外,您的 inversedBy 注释设置不正确。它们应分别指向login和。phoneemail

inversedBy并且mappedBy旨在引用关联另一侧的变量。

于 2013-10-16T07:09:56.060 回答