2015-11-12 91 views
2

我試圖建立一個innerJoin查詢使用Doctrine2/QueryBuilderSymfony2/Doctrine2 innerJoin使用QueryBuilder

$repo = $this->getDoctrine() 
     ->getRepository('MyBundle:Models'); 
$query = $repo->createQueryBuilder('m') 
     ->where('m.id = :id') 
     ->setParameter('id', $id); 

主義說:

聯接永遠屬於FROM子句中的一個組成部分。這就是爲什麼 必須將連接所屬的FROM部分的別名指定爲 的第一個參數。

作爲第二個和第三個參數,您可以指定連接表的名稱和別名 ,第四個參數包含ON子句。

Ex。

$queryBuilder 
->innerJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id'); 

我無法理解的是,'phonenumbers'表被引用到Entity NameDB Table Name

什麼其實我想要的是,有沒有什麼辦法明確提及實體像

innerJoin('u', 'MyBundle:phonenumbers', 'p', 'u.id = p.user_id')

加入時就有點混亂。可以請某人向我解釋?

幫助!!

回答

1

您正在使用表處理DQL級別,這意味着您實際上加入了一個表,因此您只需要表名稱,而不是實體名稱。表「電話號碼可能甚至沒有一個實體開始,這就是爲什麼學說要求一個表名稱,而不是一個實體名稱。

編輯

它實際上是可能的實體名稱的工作以及如下(從我自己的代碼工作的魅力所):

$builder = $this->createQueryBuilder('m'); 
$builder->innerJoin(
    'YourBundle:Category', 
    'c', 
    Join::WITH, 
    $builder->expr()->eq('m.id', 'c.mdl_id') 
); 

要使用常量加入你應該首先:

use Doctrine\ORM\Query\Expr\Join; 

但是,這也應該工作(從文件,這意味着應該像一個魅力拍攝):

$queryBuilder 
    ->select('id', 'name') 
    ->from('users') 
    ->innerJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id'); 

這是採取的形式:http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/query-builder.html#join-clauses

+0

你會怎麼寫DQL爲 '選擇m.id,m.name,c.name FROM車型爲M INNER JOIN類別爲C \t ON(m.id = c.mdl_id) WHERE c.id =?'? – Mehulkumar

+0

我更新了答案,因爲它不完全正確。從你的ModelRepository(奇怪的名字tbh)中運行它。 –

+1

謝謝。我已經解決了它。我真正在尋找的是這樣的:**在沒有關聯的實體之間進行連接是不可能的,直到版本2.4,您可以使用以下語法生成任意連接:**'選擇您從用戶u JOIN黑名單b與u.email = b.email',這在queryBuilder中也是可行的。我有兩個沒有關聯的實體,事情讓我感到困惑的是,教義是如何確定哪個表加入的。我的錯。 – Mehulkumar

1

實際上,您已經在innerJoin函數的第二個參數中明確引用了您的實體phonenumbers。

您閱讀文檔,我會通過點與你的要求重考觀點:

  • 參數1:別名FROM部分,在這裏你m(你的模型的別名)
  • 參數2 :您想要與您的模型一起加入的實體的全名
  • 參數3:訪問它的別名(就像'm'型號一樣)
  • 參數4:連接條件。 (如SQL請求的ON部分)

但隨着Symfony和,如果你有一個像你的兩個實體之間的關係:

//AppBundle/Entity/Models 

    class Models { 
     /** 
     * ... 
     **/ 
     private $id; 

     /** 
     * ... 
     * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Phone", inversedBy="models") 
     **/ 
     private $phonenumbers; 

     ... 
    } 

你只想加入你可以這樣做:

$repo = $this->getDoctrine() 
     ->getRepository('MyBundle:Models'); 
$query = $repo->createQueryBuilder('m') 
     ->innerJoin('m.phonenumbers', 'p') 
     ->where('m.id = :id') 
     ->setParameter('id', $id); 

解釋:你只需要傳遞第一個參數,你想要加入的實體屬性(這裏是你的模型的電話號碼)並將其定義爲別名(p代表電話號碼以在select中訪問它)