簡體   English   中英

使用DQL優化教義查詢

[英]Optimizing doctrine query using DQL

我在代碼中使用了一個簡單的查詢,該查詢在所有情況下均能正常工作。 這意味着,如果用戶沒有照片(例如),查詢將正常進行:

$user=$em->getRepository('UserBundle:User')->findOneById($id_user);

實體用戶與其他實體有很多關系,這就是優化查詢數量以避免Doctrine的延遲加載的原因。 然后,我使用QueryBuilder使用DQL進行此查詢:

public function findUsuario($id_user){
    $em = $this->getEntityManager();
    $qb = $em->createQueryBuilder();
    $qb->select('u, p, co, ci, f, s, q, b, r, se, com, t, beb, prof, v, h, i, idi, usf')
       ->from('UserBundle:User', 'u')
       ->innerJoin("u.pais", 'p')
       ->innerJoin("u.comunidad", 'co')
       ->innerJoin("u.ciudad", 'ci')
       ->innerJoin("u.fotos", 'f')
       ->innerJoin("u.sexo", 's')
       ->innerJoin("u.quiero", 'q')
       ->innerJoin("u.busco", 'b')
       ->innerJoin("u.relacionPareja", 'r')
       ->innerJoin("u.sexualidad", 'se')
       ->innerJoin("u.complexion", 'com')
       ->innerJoin("u.tabaco", 't')
       ->innerJoin("u.bebida", 'beb')
       ->innerJoin("u.profesion", 'prof')
       ->innerJoin("u.vivienda", 'v')
       ->innerJoin("u.hijo", 'h')
       ->innerJoin("u.ingreso", 'i')
       ->innerJoin("u.idiomas", 'idi')
       ->innerJoin("u.usuarioFavoritos", 'usf')
       ->where('u.id = :id')
       ->setParameter('id', $id_user);

    $query= $qb->getQuery();
    return $query->getSingleResult();
}

當用戶擁有有關所有相關實體的信息時,這種方法很好用,但是例如,如果用戶沒有照片,則會發生以下異常:“盡管預期至少需要一行,但未找到查詢結果”

我不明白為什么,有人可以闡明一下嗎? 謝謝

當您希望所有行在關系的另一側都具有數據時,應使用內部聯接,如果關系的另一側不存在數據,則將忽略該行。

您可以在此頁面上找到有關不同類型的JOIN的更多詳細信息。

代替innerJoin方法,您將需要使用leftJoin方法。

(另外,您還有一個更大的問題:您有太多的JOIN,建議您檢查實體的組織。)

暫無
暫無

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

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