При использовании Kohana DB, как избежать дублирования кода при подсчете нумерации страниц?

Используя конструктор запросов Kohana, возможно ли построить мой запрос по частям.

Затем выполните подсчет по указанному запросу.

Затем выполните сам запрос.

Все без необходимости писать повторяющиеся условия... один для подсчета и один для результатов...

Добавление

DB::select(array('COUNT("pid")', 'mycount'))

К основному запросу возвращается только одна запись.

Возможно ли выполнить подсчет и как-то удалить

array('COUNT("pid")', 'mycount')

из выбора...

Сейчас я могу думать только о том, чтобы найти и заменить сам код SQL, а затем просто запустить указанный код SQL... хотя должен быть лучший способ... Я надеюсь...

Спасибо!

2 ответа

Решение

Для этого я использую 3 метода. Первый возвращает результаты разбивки на страницы, второй - счетчик. В-третьих, приватный метод содержит общие условия, используемые #1 и #2. Если в запросе нужно использовать JOIN, WHERE или что-то в этом роде, все идет к #3. Таким образом, нет необходимости повторять запрос.

/* 1 */
public function get_stuff($pagination = false){
    $query = DB::select(/* ... columns here ... */);
    $query = $this->get_stuff_query($query);
    if($pagination) $query->limit($pagination->items_per_page)->offset($pagination->offset);
    return $query->execute();
}

/* 2 */
public function get_stuff_count(){
    $query = DB::select(array('COUNT("id")', 'total_rows'));
    $query = $this->get_stuff_query($query);
    $result = $query->execute();
    return $result->get('total_rows',0);
}

/* 3 */
private function get_stuff_query($query){
    $query->from(/* tablename */);
    $query->join(/* ... */);
    $query->where(/* ... */);
    return $query;
}

Используйте count_last_query()

// $db is a Database instance object
$count = $db->count_last_query();
Другие вопросы по тегам