Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 - тогда направление сортировки переключается, но тогда не работает сортировка по вычисляемому полю.
Пока дальше не разобрал - решил просто добавить две ссылочки сортировка+, сортировка-.
А код постчу - может кому полезно будет. |
|
Вернуться к началу |
|
|
|