2013-10-16 148 views
1

超過四個表這是我的問題,我發佈到Symfony的論壇,但因爲它沒有從那裏得到任何反饋,讓我們嘗試在這裏:)加入Symfony和學說

我有四個實體:AdminBundle:員工,AuthBundle:登錄,AdminBundle:Employeephone和AdminBundle:EmployeeEmail。

當然他們有relatons對方:

僱員實體

/** 
* @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; 
        } 
    } 

} 

但它給了我很好的小錯誤:

Notice: Undefined index: employee_id in C:\wamp\www\Symphony\vendor\doctrine\orm\lib\Doctrine\ORM\Query\SqlWalker.php line 826

我試過其他的一些方法,但它們都使我不同的錯誤。那麼如何正確地做到這一點?經過無數個小時的googel'ing我還沒有找到它。

回答

2

你應該通過變量的名稱來代替列名的關聯映射。

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

應該employee而不是employee_id

而且你inversedBy註釋設置不正確。他們應該分別指向loginphoneemail

inversedBymappedBy是指在關聯的相對側,以引用的變量。

+0

謝謝,它解決了我的問題。 – Kpihus