лучший способ для кнопок «следующий/предыдущий» для записей в yii

Я хотел бы знать, как лучше всего создать кнопки «следующий/предыдущий» для записи в базе данных. Допустим, у нас есть таблица с изображениями, и каждое изображение имеет идентификатор и путь. Если текущее изображение имеет идентификатор, равный «9», как я могу получить следующий и предыдущий идентификаторы?

Я уже нашел решение для этого прямо здесь, https://stackoverflow.com/a/8874382, но это, кажется, последний выбор . Если в нашей базе данных будет более 10000 записей (изображений), это перегрузит сервер. Прежде всего, он выбирает все записи, а затем пытается скопировать все результаты в массив. После этого в массиве ищется текущий ID. Это очень медленно.

Я думал об ограничении, установленном для запроса, но как я могу получить следующее и предыдущее изображения после этого?

Другим (я думаю, лучшим) решением было бы получить идентификатор текущего изображения и уменьшить/увеличить его до тех пор, пока не будет найдено другое изображение с новым идентификатором. Я думаю, что это быстрее, чем функция, представленная в ссылке.

Так же по этой же ссылке есть еще идея, установить prev_id и next_id в модели текущей картинки. Но здесь у нас та же проблема, как нам их найти? И даже если мы их найдем, правильно ли хранить данные о предыдущей/следующей картинке в текущей картинке? Это не кажется правильным, но я уверен, что это более удобно, когда вам нужно получить доступ к этим данным.

Спасибо!


person tzortzik    schedule 01.11.2012    source источник


Ответы (1)


Этот запрос вернет только следующую/предыдущую строку, если она найдена. Лучше? (Должен быть реализован в вашем классе модели).

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;
}
person jborch    schedule 01.11.2012