Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Хитрый paginate

 
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
Vlad

цитировать



Зарегистрирован: 02 Ноя 2007 11:45:52
Сообщения: 241

СообщениеДобавлено: 21 Апр 2009 22:58:03    Заголовок сообщения: Хитрый paginate Ответить с цитатой

Как бы мне ввернуть в paginate хитрый квери?

задача состоит в том, что в таблице цена может указываться в разных валютах - доллары, евро

Голым MySQL это можно сделать так:

SELECT id, price, currency_id, title,
CASE currency_id
WHEN 1
THEN price
WHEN 2
THEN price * 1.34
END AS cost_usd
FROM dec_immovables
WHERE 1
ORDER BY cost_usd DESC
LIMIT 0 , 30

Стоит ли говорить, что конструкция:

$this->paginate = array('limit' => 10,array('fields' => array('id','title','price','currency_id','country_id',"CASE currency_id WHEN 1 THEN price WHEN 2 THEN price * 1.34 END AS cost_usd"),'order' => array('cost_usd' => 'DESC')));

не работает.

Как это сделать красиво?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
evilbloodydemon

цитировать



Зарегистрирован: 11 Окт 2007 20:32:19
Сообщения: 125

СообщениеДобавлено: 22 Апр 2009 07:18:35    Заголовок сообщения: Ответить с цитатой

как по мне, так лучше сделать в таблице с валютами некий коэффициент (курс валюты), джойнить основную таблицу с валютной и в вычисляемом поле домножать цену на курс.
а этот код оставь для инопланетян и их союзников.
_________________
поздняк метаться - ракеты в воздухе
jabber-конференция по CakePHP - xmpp:cakephp@conference.jabber.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
nws

цитировать



Зарегистрирован: 25 Фев 2008 15:42:23
Сообщения: 96

СообщениеДобавлено: 22 Апр 2009 10:25:20    Заголовок сообщения: Ответить с цитатой

Имхо 2 варианта:

1. Хранить price в сессии
$conditions = array('price'=>$price);
$this->paginate('all', $conditions);

2. $this->Model->query();
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Vlad

цитировать



Зарегистрирован: 02 Ноя 2007 11:45:52
Сообщения: 241

СообщениеДобавлено: 22 Апр 2009 11:27:26    Заголовок сообщения: Ответить с цитатой

evilbloodydemon

Спасибо за пинок в нужном направлении

'fields' => array('*','((`Immovable`.`price`*`Currency`.`coeff`)) as Count'),

вот какой формат записи полей (с одной скобкой, не будет работать)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Vlad

цитировать



Зарегистрирован: 02 Ноя 2007 11:45:52
Сообщения: 241

СообщениеДобавлено: 22 Апр 2009 14:25:27    Заголовок сообщения: Ответить с цитатой

Заодно переопределил paginate

Код:

   function paginate($object = null, $scope = array(), $whitelist = array()) {
      if ($this->params['named']['sort'] == 'price') {
         if (!isset($this->paginate['fields'])) $this->paginate['fields'][] = '*';
         $this->paginate['fields'][] = '((`Immovable`.`price`*`Currency`.`coeff`)) as Count';
         $this->paginate['order'] = array('Count' => $this->params['named']['direction']);
         $whitelist = array('sort','direction','page');
      }
      return parent::paginate($object, $scope, $whitelist);
   }


Единственное что неработает - при тыканьи на колонку price - не переключается direction:Asc/Desc
всё время - asc

Если убрать определение $whitelist - тогда направление сортировки переключается, но тогда не работает сортировка по вычисляемому полю.

Пока дальше не разобрал - решил просто добавить две ссылочки сортировка+, сортировка-.

А код постчу - может кому полезно будет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Very Happy Smile Sad Surprised
Shocked Confused Cool Laughing
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы можете редактировать свои сообщения
Вы можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru