2013-04-08 121 views
4

試圖獲取用戶喜歡的狀態。symfony2 doctrine expr子查詢:錯誤:無效的參數編號

public function getLikedStatuses(User $user) 
{ 
    $qb = $this->_em->createQueryBuilder(); 
       $qb 
       ->select('s.id') 
       ->from('WallBundle:Likes','l') 
       ->innerJoin('l.status', 's') 
       ->where('l.user = :user') 
       ->setParameter('user', $user) 
       ->orderBy('s.id','DESC') 
      ; 

    $qb2= $this->_em->createQueryBuilder() 
     ->select('st') 
     ->from('WallBundle:Status','st'); 

     $qb2 ->andWhere($qb2->expr()->in('st.id',$qb->getDQL())); 


    return $qb2->getQuery()->getResult(); 
} 

Error: Invalid parameter number: number of bound variables does not match number of tokens

BTW:當我轉儲$ QB-> getDQL():

string 'SELECT s.id FROM TB\WBundle\Entity\Likes l LEFT JOIN l.status s WHERE l.user = :user' (length=87) 

BTW2:當我更換 '$ QB-> getDQL()' 的(12073) (狀態ID),它的工作原理...

+1

你怎麼檢索'getLikedStatusesFinal()''$ qb'? – DonCallisto 2013-04-08 13:35:42

+0

我重建了我的代碼,現在檢查它的更多對象。 – EnchanterIO 2013-04-08 15:20:05

+0

'$ qb2-> getDQL()''的'var_dump'是什麼? – Squazic 2013-04-08 15:40:41

回答

0

由於使用子查詢時學說不支持的限制(look at my comment )一種可能的解決方案是執行兩個單獨的查詢,這不是理想的,但工作。

/** 
* @param User $user 
* @param int $limit 
* @param int $offset 
* @return User[] 
*/ 
public function getUserFollowers(User $user, $limit = 20, $offset = 0) 
{ 
    $_followersIds = $this->getEntityManager() 
     ->createQueryBuilder() 
     ->select('IDENTITY(r.followeduser)') 
     ->from($this->getEntityName(), 'r') 
     ->where('r.followeeuser = :user') 
     ->andWhere('r.followeduser !=:user') 
     ->setParameter('user', $user) 
     ->orderBy('r.id', 'DESC') 
     ->setFirstResult($offset) 
     ->setMaxResults($limit) 
     ->getQuery() 
     ->getResult(); 

    $_usersQb = $this->getEntityManager()->createQueryBuilder(); 
    $_usersQb 
     ->select('u') 
     ->from('UserBundle:User', 'u') 
     ->where('u.id IN (:followersIds)') 
     ->setParameter('followersIds', array_values($_followersIds)); 

    return $_usersQb->getQuery()->getResult(); 
} 
0

嘗試更換->where('l.user = :user')這個where('l.user = ?1') 並添加$qb->setParameter(1, $yourValue);

+0

仍然相同.. – EnchanterIO 2013-04-08 11:25:05

4

其實你可以做一個更簡單的查詢,這取決於你如何做你的註釋。

喜歡的東西:

$qb = $this->_em->createQueryBuilder() 
    ->select('s') 
    ->from('WallBundle:Status','st') 
    ->innerJoin('st.like','l') 
    ->where('l.user = :user') 
    ->setParameter('user', $user) 
    ->getQuery() 
    ->getResult(); 

這也應該這樣做,更短,更容易理解,因爲只有一個查詢。


更新:爲你今天做,並通過把兩個setParameters在第二個查詢解決它,我有完全相同的問題。因此我找到了另一種解決方法!

我做了完全一樣的:

$qb = $this->_em->createQueryBuilder() 
    ->select('s.id') 
    ->from('WallBundle:Likes','l') 
    ->innerJoin('l.status', 's') 
    ->where('l.user = :user') 
    ->orderBy('s.id','DESC') 
    ->getDQL() 
; 

$qb2= $this->_em->createQueryBuilder() 
    ->select('st') 
    ->from('WallBundle:Status','st'); 
    ->where('st.like IN('.$qb.')') 
    ->setParameter('user', $user) 
    ->getQuery() 
; 
+0

看起來很有功能...很大的希望...但失敗了,仍然有同樣的錯誤。 – EnchanterIO 2013-04-08 16:06:18

+0

thx!第二個查詢工作...爲什麼它沒有想到我..哦。不知道爲什麼第一但是..好吧,這很好,它將是100%的工作永遠是正確的?沒有錯誤,因爲內部聯接來自likes.status_id ...並且由於外部鍵到狀態表必須存在。所以沒問題吧?關於表演:花了7.86ms,這也不錯吧? – EnchanterIO 2013-04-08 16:39:56

+0

@Trki如果它有效的話。我的意思是7.86毫秒是比較小的印刷視圖所需的時間!這可能不是有意義的。 – 2013-04-08 16:41:45

0

試圖改變這種

$qb2= $this->_em->createQueryBuilder() 
     ->select('st') 
     ->from('WallBundle:Status','st'); 
$qb2 ->andWhere($qb2->expr()->in('st.id',$qb->getDQL())); 

$qb2= $this->_em->createQueryBuilder() 
     ->select('st') 
     ->from('WallBundle:Status','st'); 
     ->where($qb2->expr()->in('st.id',$qb->getDQL())); 
+0

仍然一樣... – EnchanterIO 2013-04-08 16:03:08