3

データベース内のエントリに対して次/前のボタンを作成する最良の方法を知りたいです。画像を含むテーブルがあり、すべての画像に ID とパスがあるとします。現在の画像の ID が「9」の場合、次の ID と前の ID を取得するにはどうすればよいですか?

私はすでにここでこれに対する解決策を見つけました https://stackoverflow.com/a/8874382 しかし、これが最新の選択肢のようです。データベースに 10000 を超えるエントリ (画像) があると、サーバーに負荷がかかります。まず、すべてのエントリを選択してから、すべての結果を配列にコピーしようとします。この後、現在の ID を求めて配列が検索されます。とても遅いです。

クエリに制限を設けようかと考えていたのですが、この後、前後の画像を取得するにはどうすればよいでしょうか。

もう1つの(より良いと思います)解決策は、現在の画像のIDを取得し、新しいIDを持つ別の画像が見つかるまでそれをデクリメント/インクリメントすることです。これは、リンクで提供されている機能よりも高速だと思います。

また、同じリンクには、現在の画像のモデルに prev_id と next_id を設定する別のアイデアがあります。しかし、ここでも同じ問題があります。どうすればそれらを見つけられるでしょうか? また、それらが見つかったとしても、現在の画像に前/次の画像に関するデータを保存することは正しいですか? 正しくないようですが、そのデータにアクセスする必要がある場合は、より便利だと思います。

ありがとうございました!

4

1 に答える 1

9

このクエリは、見つかった場合、次/前の行のみを返します。より良い?(モデル クラスに実装する必要があります)。

public function getNextId()
{
    $record=self::model()->find(array(
            'condition' => 'id>:current_id',
            'order' => 'id ASC',
            'limit' => 1,
            'params'=>array(':current_id'=>$this->id),
    ));
    if($record!==null)
        return $record->id;
    return null;
}
public function getPreviousId()
{
    $record=self::model()->find(array(
            'condition' => 'id<:current_id',
            'order' => 'id DESC',
            'limit' => 1,
            'params'=>array(':current_id'=>$this->id),
    ));
    if($record!==null)
        return $record->id;
    return null;
}
于 2012-11-01T22:27:45.237 に答える