簡體   English   中英

為什么使用查詢構建器與 createQuery 時我的結果數組與水合關聯實體的形狀不同?

[英]Why is my result array with a hydrated associated entity shaped differently using query builder vs createQuery?

Doctrine 的文檔描述了兩種獲取 select 記錄及其關系的方法,一種使用“獲取連接”,另一種不使用:

獲取連接

獲取地址的連接:

<?php
$query = $em->createQuery("SELECT u, a FROM User u JOIN u.address a WHERE a.city = 'Berlin'");
$users = $query->getResult();

當 Doctrine 使用 fetch-join 組合查詢時,它會在結果數組的根級別的 FROM 子句中返回 class。 在前面的示例中,返回了一個 User 實例數組,每個用戶的地址都被提取並保存到 User#address 變量中。 如果訪問地址 Doctrine 不需要延遲加載與另一個查詢的關聯。

另一種方法

檢索 ForumUser 及其單個關聯實體:

<?php
$query = $em->createQuery('SELECT u, a FROM ForumUser u JOIN u.avatar a');
$users = $query->getResult(); // array of ForumUser objects with the avatar association loaded
echo get_class($users[0]->getAvatar());

我的問題

當我使用查詢構建器時,它的執行方式類似於獲取連接,並且我收到一個包含所有用戶的數組以及其根中的關聯。 喜歡:

$qb = $this->em->createQueryBuilder()
    ->select('u')
    ->from(User::class, 'u');

$qb->join(Address::class, 'a', Join::WITH, 'u.a = a');

$qb->addSelect('a');

// Returns
$result = [
    'user' => // User
    'address' => // Address
];

正如預期的那樣,用戶 object 的地址也被水化了。

但是我不想要這個,我希望它的形狀像第二個例子:一個只有用戶的數組,地址只能通過用戶 object 訪問。我可以簡單地過濾數組以獲得所需的形狀,但我覺得那是由於我缺乏理解而采取的解決方法。

是否可以使用查詢構建器來獲得形狀類似於上面第二個示例的結果數組? 或者我是否必須為此過濾結果數組? 令我困惑的是,兩者生成的實際 SQL 是相同的!

我來自 Laravel 和 Doctrine 對我來說是全新的,所以請原諒我在這個問題上的天真。 如果我需要澄清任何事情,請告訴我。

謝謝!

我想我在相關問題部分找到了答案: Symfony2 query builder joins to get objects as a single array

您應該加入協會,而不是加入實體的完全限定名稱。 所以查詢變成:

SELECT hs,s,h
  FROM  \App\SoBundle\Entity\HandsetSubscription hs                    
  JOIN  hs.subscription s with s.id = hs.subscription 
                    AND s.mins  = 150 
                    AND s.mb    = 250 
                    AND s.sms   = 150
  JOIN  hs.handset h with h.id = hs.handset 

暫無
暫無

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

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