Eo_Narique 16 мая 2015 1 10
сделал сортировку по цене. но сортировка проходит странно.
if($this->getProperty('sort')=='price.value'){
  $c->innerJoin('modTemplateVarResource',  'price', "price.contentid = {$this->classKey}.id AND price.tmplvarid = 12");
}
результат по убыванию
94.77
90.16
9.8
9.5
9.3
9
89.65
87.3
85.85

результат по возрастанию
10.05
10.95
106.15
106.66
11
11.4
я так понимаю, сортировка идет в строковом представлении. как исправить ситуацию, знает кто-нибудь?
10 комментариев
a
als1984 18 мая 2015г в 21:55 #
для этого есть простая хитрость в mysql синтаксисе, чтоб сортировала как числовое значение, а не как текст пишешь ORDER BY (value+0), не знаю как с join-ом но такой
<?php
$query = $modx->newQuery('modResource');
$query->where(array(
   'parent' => 70,
));
$query->groupby('id+0','DESC');
$boxes = $modx->getCollection('modResource',$query);
foreach($boxes as $key=>$val){
    $id[$key]=$val->get('id');
}
print_r($id);
запрос выполнился.
a
als1984 18 мая 2015г в 22:16 #
проверил на проекте с числовыми тв вот результаты:как текст
как число
Eo_Narique1
Eo_Narique 19 мая 2015г в 00:38 #
cgfcb.j nt,t ,jkmijt lj,hsq xtkjdtr

что в переводе с древне-транслитерийского означает «Спасибо тебе, добрый человек»
Eo_Narique1
Eo_Narique 19 мая 2015г в 00:40 #
маленькая замечание
в параметры процессора если записывать
$params = [ 'sort' => 'price.value+0' ]
то не робит, а если
$params = [ 'sort' => 'price.value +0' ]
то все ок. странно это
spector1
spector 19 мая 2015г в 10:57 #
там наверное описка, работает
$params=['sort'=>'price.value'+0]

Ничегострпнного в этом нет. PHP — язык с динамической типизацией, т.е. сложив строку(символьное представление цены) с числом, получается число.
Fi1osof1
Fi1osof 19 мая 2015г в 11:30 #
PHP — язык с динамической типизацией, т.е. сложив строку(символьное представление цены) с числом, получается число.
А при чем тут PHP? В данном случае это вопрос к MySQL. PHP (xPDO) только подготовит запрос вида price.value + 0, а вот в типу данных Число уже сам мускул приведет.
spector1
spector 19 мая 2015г в 11:46 #
В обще то да, Николай прав, ошибся.
Fi1osof1
Fi1osof 20 мая 2015г в 10:28 #
там наверное описка, работает
$params=['sort'=>'price.value'+0]
Кстати, только сейчас обратил внимание. Нет, так не правильно. Правильно именно $params=['sort'=>'price.value +0']

А вообще, если кому-то не нравится хак с +0 (что вполне нормально), можно так пробовать:
$q->sortby("CAST(price.value as unsigned)");
Eo_Narique1
Eo_Narique 22 мая 2015г в 18:08 #
в процессе появилась еще проблема.
код
$classKey = 'modResource';
$c = $modx->newQuery($classKey);
$c->innerJoin('modTemplateVarResource',  'users', "users.contentid = $classKey.id AND users.tmplvarid = 14");
$c->select(array(
    "$classKey.id as id"
    ,"users.value as users"
));
$c->sortby('users.value+0','asc');
$where = array('users.value:>=' => intval($users));
$c->where($where);
сортирует прекрасно, но фильтр по условию опять же почему-то в строковом представлении
т.е. если взять ('users.value:<=' => 5), то в результатах будут 5, 100, 150
Eo_Narique1
Eo_Narique 22 мая 2015г в 18:40 #
отвечаю сам себе
modxclub.ru/topics/xpdo-vse-polya-prisoedinyonnyix-tablicz-tipiziruet-kak-strokovyie-1664.html
$c->where(array("CAST(users.value AS unsigned) >= $users"));
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.