簡體   English   中英

Symfony2/Doctrine2 innerJoin 使用 QueryBuilder

[英]Symfony2/Doctrine2 innerJoin using QueryBuilder

我正在嘗試使用Doctrine2/QueryBuilder構建一個innerJoin查詢。

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

教義說:

連接始終屬於 from 子句的一部分。 這就是為什么您必須將連接所屬的 FROM 部分的別名指定為第一個參數的原因。

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

前任。

$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') ?

當它就這樣加入時有點混亂。 請有人向我解釋一下嗎?

幫助!!

事實上,您已經在 innerJoin 函數的第二個參數中明確引用了您的實體電話號碼。

您閱讀了文檔,我將根據您的要求逐條重新閱讀:

  • 參數 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 代表電話號碼以在選擇中訪問它)

您正在使用表在 DQL 級別上工作,這意味着您實際上連接了一個表,因此您只需要表名,而不是實體名。 表“phonenumbers 甚至可能沒有實體開始,這就是為什么 Doctrine 請求表名而不是實體名。

編輯

實際上可以使用實體名稱以及以下內容(取自我自己的代碼,它作為一種魅力):

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

要使用 Join 中的常量,您應該首先:

use Doctrine\ORM\Query\Expr\Join;

但這也應該有效(取自文檔,這意味着應該像魅力一樣工作):

$queryBuilder
    ->select('id', 'name')
    ->from('users', 'u')
    ->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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM