2016-05-19 15 views
1

私は、プロパティ= trueを特集しているトップ3ユーザーを取得しようとしています。Doctrine2はnullの代わりに1要素の配列を返します

public function getFeaturedCleaners() 
{ 
    $baseQuery = $this->_baseCleanerQuery(); 

    return $baseQuery 
     ->where($baseQuery->expr()->eq('c.featured', $baseQuery->expr()->literal(true))) 
     ->andWhere($baseQuery->expr()->isNotNull('c.user')) 
     ->orderBy('ratingTotal', 'DESC') 
     ->setMaxResults(3) 
     ->getQuery()->getArrayResult(); 
} 

private function _baseCleanerQuery() 
{ 
    return $this->createQueryBuilder('c') 
     ->select([ 
      'c as user', 
      'COALESCE(AVG(rv.speed), 0) as ratingSpeed', 
      'COALESCE(AVG(rv.quality), 0) as ratingQuality', 
      'COALESCE(AVG(rv.responsibility), 0) as ratingResponsibility', 
      'COALESCE((AVG(rv.speed) + AVG(rv.quality) + AVG(rv.responsibility))/3, 0) as ratingTotal', 
     ]) 
     ->leftJoin('c.reviews', 'rv'); 
} 

しかし、誰ユーザーを特色がありませんとき、私はヌルフィールド、代わりに空の配列を1行を取得:ここに私のEntityRepositoryです

array(1) { [0]=> array(5) { ["user"]=> NULL ["ratingSpeed"]=> string(6) "0.0000" ["ratingQuality"]=> string(6) "0.0000" ["ratingResponsibility"]=> string(6) "0.0000" ["ratingTotal"]=> string(10) "0.00000000" } } 

は、なぜそれが起こっているのでしょうか?どうすれば修正できますか?

答えて

1

これは、(AVGを使用して)クエリで集計を使用しているためです。その結果、常に結果と少なくとも1つの行が得られます。

SELECT AVG(0) FROM user WHERE 0; 

このクエリは、常に結果、ないnull結果、少なくとも1行を返します。

このままクエリを続行する必要がある場合は、結果がフィルタリングされてから、ユーザーがnullでないことを確認してから返されます。空の配列が返されます。

return (null == $result[0]['user'] ? [] : $result); 
関連する問題