在Symfony和Doctrine中加入四个表

时间:2013-10-16 06:51:21

标签: php symfony doctrine-orm

这是我发布到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,我还没想到它。

1 个答案:

答案 0 :(得分:2)

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

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

应该是employee而不是employee_id

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

inversedBymappedBy用于引用关联对面的变量。