Kohana ORM. COUNT_ALL() и RESET(false)

kohana
Кто работал с пагинацией наверняка сталкивался с такой задачкой. Дана выборка со сложными фильтрами, надо узнать количество элементов всего и выдернуть, условно говоря, 10 элементов начиная с 30-го. Надо просто выполнить два похожих запроса. Например так:

$count= ORM::factory("post") -> 
            where("published","=",1) -> count_all();
$posts= ORM::factory("post") -> 
           where("published","=",1) -> 
           limit(10)->offset(30)-> found_all();

Обратите внимание, в этом примере у нас был фильтр published=1 . Пока всё просто и понятно. Мы просто дважды выполнили запрос со схожими фильтрами.

Но иногда фильтры бывают довольно сложными и генерироваться несколькими страницами кода. В таких случаях возникает соблазн один раз накопить фильтры, чтобы дважды потом использовать. Однако есть проблема. Функция count_all() сбрасывает ORM в ноль в том числе и все фильтры.

Что же делать? Чтобы ORM не сбрасывалась, нужно один раз запустить функцию reset(false). Пример:

$posts = ORM::factory("post") -> reset(false); /// Вот оно!
$posts = $posts -> where("published","=",1);
// Дальше накручиваем фильтров
if(......){
   $posts = $posts->where( ..........);
}
.........................

$count = $posts - >count_all();

// Теперь ничего не теряется
$posts = $posts -> limit(10)->offset(30)-> found_all();

Вот такая зарубочка на память.

Kohana ORM. COUNT_ALL() и RESET(false): 3 комментария

  1. Nks

    Хорошо, что я отказался таки от коханы и кодигнайтера и перешел на Yii :3 Все же в yii все намного проще…

  2. altesack Автор записи

    Главное знать где и что лежит :)
    Кстати, не посоветуешь что-нибудь для быстрого вхождения в Yii?

Комментарии запрещены.