1

ID、ゲーム (外部キー)、および日付を持つ表 Comment からコメントを取得しようとしています。

コメントを求めるたびに、特定のゲームの日付順に並べ替えられた 3 つのコメントを取得したいと考えており、後で表示するコメントが他にもあるかどうかを知りたいと考えています。そのために、2 つの関数を作成しました。最初の関数は 3 つのコメントを返します。

public function getRecentComments($offset,$id) {
    $dql = "SELECT c FROM Comment c 
        WHERE c.game = ?1
        ORDER BY c.date DESC";
    $query = $this->getEntityManager()->
        createQuery($dql)->
        setParameter(1, (int)$id)->    
        setMaxResults(3)->
        setFirstResult($offset);
    return $query->getResult();

2 つ目は、後で取得できるコメントの数を返します。この機能の理由は、「コメントをもっと見る」ボタンを表示するかどうかです。これは 2 番目の関数です。

public function moreComments($offset,$id) {

    $dql = "SELECT COUNT(c.id) FROM Comment c
        WHERE c.game = ?1
        ORDER BY c.date DESC";
    $query = $this->getEntityManager()
        ->createQuery($dql)
        ->setParameter(1, (int)$idPartido)
        ->setFirstResult($offset+3)    
        ->setMaxResults(1)
        ->getSingleScalarResult();

    return $query;
}

しかし、2 番目の関数は次のエラーでは機能しません。

致命的なエラー: キャッチされない例外 'Doctrine\ORM\NoResultException' とメッセージ 'クエリの結果が見つかりませんでしたが、少なくとも 1 つの行が予期されていました。

setFirstResult と count() を使用するためだと思います。

だから、私は使用しました

public function moreComments($offset,$id) {

    $dql = "SELECT c FROM Comentario c
        WHERE c.partido = ?1
        ORDER BY c.fecha DESC";
    $query = $this->getEntityManager()
        ->createQuery($dql)
        ->setParameter(1, (int)$idPartido)
        ->setFirstResult($offset+3)    
        ->setMaxResults(1)
        ->getSingleScalarResult();

    return sizeof($query);
}

カウントだけのデータを取得するべきではないため、これは明らかに悪い書き方です。2番目の関数を正しく書くにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

4

MySQL のみを使用する場合は、そのFOUND_ROWS()機能を利用できます。

これにはネイティブ クエリを使用する必要があり、MySQL 以外の DB を使用する能力を妨げる可能性がありますが、私の経験では非常にうまく機能します。

私は次のようなものを使用して大成功を収めました。

use Doctrine\ORM\Query\ResultSetMapping;

public function getRecentComments($offset, $id) {
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM Comment c 
        WHERE c.game = ?
        ORDER BY c.date DESC
        LIMIT ?,3";
    $rsm = new ResultSetMapping();
    $rsm->addEntityResult('Comment', 'c');
    $rsm->addFieldResult('c', 'id', 'id');
    $rsm->addFieldResult('c', 'game_id', 'game_id');
    $rsm->addFieldResult('c', 'date', 'date');
    $query = $this->getEntityManager()->createNativeQuery($dql, $rsm);
    $query->setParameters(array(
      (int)$id,
      (int)$offset
    ));
    $results = $query->getResult();

    // Run FOUND_ROWS query and add to results array
    $sql = 'SELECT FOUND_ROWS() AS foundRows';
    $rsm = new ResultSetMapping();
    $rsm->addScalarResult('foundRows', 'foundRows');
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
    $foundRows = $query->getResult();
    $results['foundRows'] = $foundRows[0]['foundRows'];

    return $results;
}

上記の関数から結果配列を取得した後、'foundRows' 要素を別の変数に抽出し、それを設定解除して (つまり、unset($results['foundRows']))、配列を通常どおり使用し続けます。

お役に立てれば。

于 2012-07-14T09:09:16.910 に答える