войти зарегистрироваться

Doctrine ORMПагинация в Doctrine — считаем количество записей с помощью SQL_CALC_FOUND_ROWS (MySQL) из песочницы

Предыстория


Не так давно, в связи с производственной необходимостью, я познакомился с замечательным фреймворком Symfony 2, в котором для работы с базой данных используется мощная популярная библиотека — Doctrine 2, включающая в себя два компонента: ORM (Object relational mapper) и DBAL (Database Abstraction Layer). ORM предоставляет приложению возможность общаться с базой данных на языке объектов, а DBAL, в свою очередь, представляет собой более низкоуровневый способ доступа к данным посредством написания запросов, основанный на php-библиотеке PDO. ORM предоставляет множество преимуществ при разработке сложных бизнес-приложений, но в то же время налагает и ряд ограничений, связанных с тем, что разработчику не приходится писать непосредственно SQL-запросы — ORM Doctrine предлагает свой собственный, объектно-ориентированный язык запросов, который преобразуется в привычный SQL уже за кадром. С одним из таких ограничений я и столкнулся, и хочу поделиться, каким образом я его успешно преодолел. Речь пойдёт о получении общего количества записей, возвращаемых запросом, если убрать из него ограничение LIMIT.

symfony frameworkПостраничный вывод на Symfony 2


Привет Хабрасообщество!

Предисловие


Я пользуюсь «благами» Symfony недавно, и нет границам моей радости, потому что вышел второй релиз — Symfony 2. Не побоюсь этих слов — это новый «язык» программирования, новая платформа для создания веб-приложений. Симфони2 изменил процесс программирования на PHP (по крайней мере для меня :) )

Поскольку русским языком владею не очень хорошо, то комментариев будет мало. По-моему все будет понятно из кода. Просто возьмите код и используйте :)

Features :)


  1. Постраничный вывод
  2. Постраничный вывод с сортировкой

Django FrameworkДелим на страницы

Практически в любом сайте есть нужда разбить вывод информации на страницы. В джанге уже есть некоторые вещи которые помогут в написании своего пагинатора, но вот что бы взять и в две строчки сделать пагинацию для любой вьюшки — такого пока не встречал.

Я решил написать такой, благо идея как его сделать у меня зародилась уже давно. Итак встречаем, django-simplepagination.

DrupalНебольшой апгрейд постраничной навигации Drupal-a

На мой взгляд, у стандартной постраничной навигации Друпала есть несколько недостатков.

Во-первых, ссылка на последнюю страницу стала бы более информативна и занимала бы меньше места, если её заменить на номер последней страницы [28].


Во-вторых, стоит нам перейти на вторую страницу и мы тут же видим две ссылки на первую страницу: [1] и [Первая]


Аналогичную картину мы видим с противоположной стороны навигационной линейки


Ниже привожу вариант своего решения этих недочетов (для Drupal 6.x)

Персональные блоги CakePHP и хитрая pagination

У меня в CakePHP самое больное место — pagination. Особенно когда дело касается хитростей. Банальный ->find('all') работает всегда (ну почти всегда) хорошо и замечательно, а вот pagination…
Дано:

  1. Есть табличка объектов недвижимости (Immovable) с указанной ценой (Immovable.price) и типом валюты (Immovable.currency_id)
  2. Есть табличка валюты (Currency) с полями: id, name, coeff (коэффициент)

Соответственно в таблице валюты есть коэффициенты USD coeff = 1, для валюты Euro coeff=1.34.
Задача:

Сортировать выдачу (paginate) по цене, с учётом валюты. Т.е. дом за 100 000 евро дороже, чем дом за 110 000 долларов (при курсе 1 к 1.34)
Решение

$this->paginate = array('order' => array('Count' => 'ASC'),
'fields' => array('*','((`Immovable`.`price`*`Currency`.`coeff`)) as Count'));


Да, именно в двойных скобках. Тогда запрос будет правильным с положенным LEFT JOIN к Currency и правильной сортировкой по вычисляемому полю.

Да, тестировал с MySQL, ибо с другими базами работать не довелось. Надеюсь кому-нить это поможет :)