[Решено] TV в условии

Всем привет! Есть задачка — получить ресурсы у которых TV поле меньше 400 и больше 420.
На первый взгляд задачка тривиальная кажется все просто, но на практике получаем, что в базе поле хранится как строка (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. Но хочется реализовать все на стороне базу данных.
Максим
26 марта 2019, 13:03
modx.pro
607
0
Поблагодарить автора Отправить деньги

Комментарии: 3

Максим
26 марта 2019, 13:35
0
Всем спасибо за внимание! Разобрался! Необходимо использовать BETWEEN а не больше и меньше.
    Илья Уткин
    26 марта 2019, 14:15
    0
    А почему CAST(Square.value AS SIGNED) AS square? Если сделать DECIMAL — разве не будет работать больше и меньше?

    CAST(Square.value AS DECIMAL(13,3)) AS square
      Максим
      26 марта 2019, 14:56
      0
      Ну SIGNED это по-сути диапазон целых чисел. У меня в базе пока целые числа. Так что не думаю что DECIMAL изменит ситуацию.
      Но, Илья, в любом случае спасибо! Буду тестировать!)
      P.S. Пока еще не проверял BETWEEN с числами с плавающей точкой!)))
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3