2016-11-29 3 views
0

Doctrineの新機能。私は "最近のアイテムをリストする"機能を構築しようとしています。 は3ヶ月より新しいすべてのレコードを取得する必要がありますしかし結果が50レコード未満の場合は、5030がフェッチされるまで古いレコードを取得する必要がありますDoctrineで最近のアイテムを取得する

もし私が3ヶ月より新しいレコードを持っていれば、私はそれらのすべてを返すが、それ以上は何も返さない。私が過去3ヶ月間に20件のレコードを持っていれば、それを返したいと思っています。

Doctrineではどうしますか?可能であれば、2つのクエリー(それはそれを呼び出すことさえありますか?)をしたくありません。今、次のように私のEntityRepositoryがちょうど最後の3ヶ月からすべてのレコードを取得するために

public function fetchRecent($from) 
{ 
    $criteria = new Criteria(); 
    $criteria->where($criteria->expr()->gte('created', $from)); 

    return $this->matching($criteria); 
} 
+0

これを行う方法は1つのクエリではわかりません。 –

答えて

0

編集

ハムは、私は少し速すぎて読み、あなたは制限しません3カ月以上経過していなければ記録する。私は単一のクエリでこれを達成する方法を見ていません。 (私はもう一度考えますが、実際は見ることはできません)

データベースにクエリを行って、最近のレコードの数を確認し、実際の結果を照会することができます。

public function fetchRecent($from, $nbRecords = 50) 
{ 
    $count = $this->createQueryBuilder('c') 
     ->select('COUNT(c.id)') 
     ->andWhere('c.created >= :from')->setParameter('from', $from) 
     ->addOrderBy('c.created', 'desc'); 
    $nbNewer = $count->getQuery()->getSingleScalarResult(); 

    $query = $this->createQueryBuilder('q'); 
    if ($nbNewer<$nbRecords) { 
     $query->setMaxResults($nbRecords); 
    } else { 
     $query->andWhere('q.created >= :from')->setParameter('from', $from); 
    } 
    $query->addOrderBy('q.created', 'desc'); 

    return $query->getQuery()->getResult(); 
} 
関連する問題