Как заставить xpdo НЕ заключать значение в кавычки
Вопрос простой: как заставить xpdo НЕ заключать значение в кавычки:
Здесь мы нуль заключается в кавычки:
Можно, конечно, отказаться от ключа и всё условие целиком записать в качестве значения:
$query->where(array(array('tvTable3.value:IS' => null),
array('tvTable3.value:=' => ''),
array('tvTable3.value:<' => 0)),
xPDOQuery::SQL_OR);Здесь мы нуль заключается в кавычки:
`tvTable3`.`value` IS NULL OR `tvTable3`.`value` = '' OR `tvTable3`.`value` <= '0'Можно, конечно, отказаться от ключа и всё условие целиком записать в качестве значения:
$query->where(array(array('tvTable3.value:IS' => null),
array('tvTable3.value:=' => ''),
array('tvTable3.value <= 0')),
xPDOQuery::SQL_OR);Но в этом случае мы исключаем значение 0 из xpdo-обработки. Комментарии: 13
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Проверяем:
Выводит:
Как видишь, для id нет ковычек, а для pagetitle — есть.
Не указал сразу — речь идёт о полях TV. При работе с TV xpdo всегода заключает значения в кавычки.
Да, значения TV-полей физически (на уровне БД) имеют строковый тип. Но xpdo не принимает во внимание тип этих полей, указанных в свойствах TV. Всегда рассматривает их как строки.
Тип ТВ значения не имеет, потому что это никак не влияет на его способ хранения в БД.
Нелогично получается с точки зрения modx: тип TV-поля указывать можно, все необходимые операции с такими TV-полями посредством xpdo можно выполнять (т.е. формируем почти любые запросы), а корректно сравнивать числовые TV (элементарная операция) посредством xpdo — нельзя. Серьёзная дыра в модели xpdo. Не иначе.
В моделе указано, что тип поля — строка, поэтому автоматическая генерация оборачивает значение в ковычки. Если указано int — будет без ковычек. Если не устраивает автоматическая обработка, и ты хочешь для строки указать условие как int — пиши его сам.
Тебе ничего не запрещают — делай как хочешь.
xPDO — это php класс, он не волшебный, он только готовит запросы и получает данные из БД. Сравнение производит mysql, а не xpdo.
ТВ — это строка и mysql начхать, что там в MODX указано — в БД это все равно строка и сравниваться она будет как строка, с кавычками ты там указал условие или нет.
Если ты хочешь выбирать и сравнивать строки как числа — нужно приводить тип данных в mysql, типа
Например, pdoTools учитывает тип ТВ и говорит сравнивать числа как числа, даты как даты, а не как строки.
pdoTools тоже работает на xPDOи запрос строится с его помощью. Но это не мешает мне указать правильное для меня условие.
но для условия where (TV.value < 0)
При выборке типы автоматически приводятся, это не сортировка. Mysql выберет одно и тоже, если указать условие хоть строкой, хоть целым числом.
Или у тебя если число в ковычках — что-то не то выбирается? Будь добр, покажи реальный пример, а то я вообще понять не могу, какой ты фигнёй страдаешь.
то xpdo всё равно сформирует sql-запрос со строковым сравнением (заключит нуль в кавычки):
Это ответ на пример с ORDER BY CAST
В модели поле value имеет тип «string», значит нужно обернуть 0 в ковычки. Если ты хочешь избежать автоматической обработки, нужно указать готовое условие без ковычек, строкой, как в этом примере.
Неужели до сих пор не понятно?
Повторяю свой вопрос еще раз: чего ты вообще хочешь добиться, указывая числа с ковычками или без? Это никак не влияет на результаты выборки, mysql приводит типы самостоятельно.
Не понятно, почему xpdo не учитывает тип TV-параметра, указанный в его свойствах. Следуя концепции TV-параметров, при формировании SQL нужно учитывать тип TV-параметра, указанный в его свойствах. Если указан числовой тип, то и операции сравнения должны быть числовыми (значение не должно заключаться в скобки). А то, что на уровне БД значения TV имеют строковый тип — это исключительно способ хранения данных, который выбрали разработчики modx.
Согласно концепции TV-параметров, эти параметры являются типизированными. Соотсветственно, и способ их обработки должен отвечать их типу. xpdo всё мешает в кучу.
xPDO учитывает тип ТВ параметра. И тип у него, внимание, строка!
То что там в админке ты крутишь — xPDO до фонаря, он работает на более низком уровне. В xPDO нет никаких ТВ параметров, это уже из MODX который является надстройкой над xPDO. Для него не имеет значение ничего, кроме модели.
В модели нет такого понятия, как «это поле может быть строкой, а может и числом — в зависимости от чекбокса в админке».
Точно также, как нет такой фигни и в самой базе данных, ферштейн? Там поле или строка, или число, оно не меняется в зависимости от контекста.
Если ты хранишь числа в строках — это тоже строки, как не запрашивай, какие условия не задавай, в таблице это строки!
Ты, наверное хочешь, что при каждом запросе ТВ через xPDO, он лез в таблицу ТВ (а таблица с самим ТВ и его значениями — 2 разных таблицы), смотрел там тип ТВ и строил запрос как-то иначе, наплевав на прописанный тип в модели?
Так вот, xPDO об этом ничего не знает, потому что ничего такого в модели и БД не бывает в принципе.
Я не знаю, как еще понятнее объяснить.
xPDO можно использовать отдельно, и естественно, никаких ТВ параметров там не будет.
Вот сайт xPDO, а вот его репозиторий.