[Решено] TV в условии
        Всем привет! Есть задачка — получить ресурсы у которых TV поле меньше 400 и больше 420.
На первый взгляд задачка тривиальная кажется все просто, но на практике получаем, что в базе поле хранится как строка (mediumtext), хоть в админке и установлен тип число.
Вот такой код:
Как правильно составить запрос?
P.S. Пока просто выбираю нужные ресурсы и дальше фильтрую силами php. Но хочется реализовать все на стороне базу данных.
    
    
                                                        На первый взгляд задачка тривиальная кажется все просто, но на практике получаем, что в базе поле хранится как строка (mediumtext), хоть в админке и установлен тип число.
Вот такой код:
$parents = '2240';
$pdoFetch = $modx->getService('pdoFetch');
$where = array(
    'published' => '1',
    'deleted' => '0',
    'Square.value:>=' => '400',
    'Square.value:<=' => '420'
);
$leftJoin = array(
    'Square' => array(
        'class' => 'modTemplateVarResource',
        'on' => 'Square.contentid = modResource.id AND Square.tmplvarid = 49'
    )
);
$select = array(
    'modResource' => 'id,pagetitle,parent',
    'Square' => 'CAST(Square.value AS SIGNED) AS square'
);
$options = array(
    'class' => 'modResource',
    'parents' => $parents,
    'leftJoin' => $modx->toJSON($leftJoin),
    'where' => $modx->toJSON($where),
    'return' => 'data',
    'select' => $modx->toJSON($select),
    'limit' => 0
);
$pdoFetch->setConfig($options, false);
$products = $pdoFetch->run();Выдает вот такой результат:array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    string(4) "8467"
    ["pagetitle"]=>
    string(82) "Участок + здание 415,88м2 Район Лефортово ГП16804754"
    ["parent"]=>
    string(4) "2240"
    ["square"]=>
    string(3) "415"
  }
  [1]=>
  array(4) {
    ["id"]=>
    string(4) "8619"
    ["pagetitle"]=>
    string(78) "Здание 4 161,88м2 Район Преображенское ГП16842909"
    ["parent"]=>
    string(4) "2240"
    ["square"]=>
    string(4) "4161"
  }
}Если в условии Square.value меняю на square или Square.square то в ответ получаю пустоту.Как правильно составить запрос?
P.S. Пока просто выбираю нужные ресурсы и дальше фильтрую силами php. Но хочется реализовать все на стороне базу данных.
            
                Поблагодарить автора            
            
                 Отправить деньги            
        
        
            Комментарии: 3
                Всем спасибо за внимание! Разобрался! Необходимо использовать BETWEEN а не больше и меньше.            
                    
                А почему CAST(Square.value AS SIGNED) AS square? Если сделать DECIMAL — разве не будет работать больше и меньше?
                    CAST(Square.value AS DECIMAL(13,3)) AS square            
                Ну SIGNED это по-сути диапазон целых чисел. У меня в базе пока целые числа. Так что не думаю что DECIMAL изменит ситуацию.
Но, Илья, в любом случае спасибо! Буду тестировать!)
P.S. Пока еще не проверял BETWEEN с числами с плавающей точкой!)))
                    Но, Илья, в любом случае спасибо! Буду тестировать!)
P.S. Пока еще не проверял BETWEEN с числами с плавающей точкой!)))
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.