2015-12-16 50 views
2

我的數據庫結構如下:Symfony2的 - 如何查詢符合條件的學說左加入2

用戶< - >個人< - >學校

所以個人對象保存有關信息用戶和學校這樣的:

class Personal 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\ManyToOne(targetEntity="user", inversedBy="schools", fetch="EAGER") 
    */ 
    private $user; 

    /** 
    * @var string 
    * 
    * @ORM\ManyToOne(targetEntity="school", inversedBy="personal", fetch="EAGER") 
    */ 
    private $school; 
} 

所以我想獲取一個用戶的學校:

$query = $qb 
    ->select('school') 
    ->from('AppBundle:School', 'school') 
    ->leftJoin('school.personal', 'p', 'WITH', 'p.user = :user') 
    ->setParameters(array(':user' => $user)) 
    ->getQuery(); 

我也試過如下:

$query = $qb 
    ->select('school') 
    ->from('AppBundle:School', 'school') 
    ->leftJoin('u.personal', 'personal') 
    ->leftJoin('personal.user', 'pu') 
    ->where('pu = :user') 
    ->setParameters(array(':user' => $user)) 
    ->getQuery(); 

但沒有任何工程。第一個讓我回到所有的學校:S。第二個查詢沒有回校! :(

我怎樣才能得到所有學校用戶

+0

什麼是$ QB? $ qb = $ em-> getRepository(「AppBundle:Personal」)?? – bluesky

+0

看看http://stackoverflow.com/questions/23454217/doctrine2-association-mapping-with-conditions 這是解決使用標準的API那裏 – DerStoffel

回答

3

你幾乎與你的第二次嘗試過它:

$query = $qb 
    ->select('school') 
    ->from('AppBundle:School', 'school') 
    ->leftJoin('school.personal', 'personal') 
    ->leftJoin('personal.user', 'user') 
    ->where('user.id = :userId') 
    ->setParameters(array(':userId' => $user->getId())) 
    ->getQuery(); 
+0

我不明白。這也是一個左連接。他仍然會得到所有的學校... – Wilt

+1

在哪裏條件照顧它。只有與特定用戶相關聯的學校纔會被選中。 – Cerad

+0

好吧,你是對的。我想我們可以在這裏避免[此討論](http://stackoverflow.com/a/1018825/1697459)。我的回答也是正確的,我想知道爲什麼自從我第一次以來,@Slowwie接受了你的...... – Wilt

2

你說這個?。

$query = $qb 
    ->select('school') 
    ->from('AppBundle:School', 'school') 
    ->leftJoin('school.personal', 'p', 'WITH', 'p.user = :user') 
    ->setParameters(array(':user' => $user)) 
    ->getQuery(); 

給你回所有學校這正是a left-join是應該做的

如果你只想要有個人用戶的學校(從你的問題我猜你就是你想達到的),你應該使用a inner-join

$query = $qb 
    ->select('school') 
    ->from('AppBundle:School', 'school') 
    ->innerJoin('school.personal', 'p', 'WITH', 'p.user = :user') 
    ->setParameters(array(':user' => $user)) 
    ->getQuery();