2013-11-15 58 views
1

我在我的代碼中使用了一個簡單的查詢,在所有情況下都能正常工作。這意味着,如果用戶還沒有照片(例如)查詢那張罰款:使用DQL優化原則查詢

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

實體的用戶有很多與其他實體的關係,這是優化的查詢數,以避免理由學說的懶惰加載。然後,我讓這個查詢使用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(); 
} 

這種運作良好,當用戶對所有相關實體的信息,但如果例如用戶沒有照片時,會出現以下異常:「沒有結果發現查詢雖然至少有一行是預計「

我不明白爲什麼,任何人都可以擺脫一些光?謝謝

回答

2

如果您希望您的所有行在關係的另一端具有數據(如果關係的另一端不存在數據,那麼該行將被省略)時應該使用內部聯接。

您可以找到有關不同類型JOIN on this page的更多詳細信息。

而不是innerJoin方法,您將需要使用leftJoin方法。

(另外,你有一個更大的問題:你有太多的連接,我建議您檢查自己的實體組織。)

+0

這是問題,現在工作得很好。謝謝!關於許多JOINS,是因爲每個用戶都有很多屬性,但這是應用程序類型固有的。 –