Сталкивался с проблемами в pdoFetch
Это копия github.com/sergant210/pdoTools/issues/311. На гитхаб не читабельно из-за того, что апострофы на sql на markdown выделяются как код.
1) В этой строке в $fields приходил почему-то массив github.com/sergant210/pdoTools/blob/daf2e1c2062c2a3080bde221672a43c7dab2e11c/core/components/pdotools/model/pdotools/pdofetch.class.php#L368
Сейчас такое воспроизвести не удалось. Где-то видно сам косячил.
2)
3) Не работают вложенные функции SQL
Решение(может костыль) в строке github.com/sergant210/pdoTools/blob/daf2e1c2062c2a3080bde221672a43c7dab2e11c/core/components/pdotools/model/pdotools/pdofetch.class.php#L373
Добавить в регулярку AS, так как на функции стопроцентно алиас ставиться.
Преодолел костылем
github.com/sergant210/pdoTools/blob/daf2e1c2062c2a3080bde221672a43c7dab2e11c/core/components/pdotools/model/pdotools/pdofetch.class.php#L516
1) В этой строке в $fields приходил почему-то массив github.com/sergant210/pdoTools/blob/daf2e1c2062c2a3080bde221672a43c7dab2e11c/core/components/pdotools/model/pdotools/pdofetch.class.php#L368
Сейчас такое воспроизвести не удалось. Где-то видно сам косячил.
2)
'select'=>[
'modResource'=>'DISTINCT pagetitle',
],Выдает 0.0001791: SQL prepared "SELECT `` FROM `modx_site_content`в отличии от 'select'=>[
'modResource'=>'DISTINCT modResource.pagetitle',
],Вообщем-то не страшно.3) Не работают вложенные функции SQL
$pdo = $modx->getService("pdoFetch");
$default = [
'select'=>[
'modResource'=>'modResource.id,IF(SUM(modResource.published)/COUNT(*) = 1,1,0) as all_published',
],
'groupby'=>'modResource.parent',
'setTotal'=>0,
'limit'=>10,
'return'=>'data',
];
$pdo->setConfig($default);
$pdo->run();
echo "<pre>".$pdo->getTime()."</pre>";Выдает0.0001471: SQL prepared "SELECT modResource.id, IF(SUM(modResource.published)/COUNT(*) = 1, `1`, 0) as all_published FROM `modx_site_content`ставит кавычку на `1`Решение(может костыль) в строке github.com/sergant210/pdoTools/blob/daf2e1c2062c2a3080bde221672a43c7dab2e11c/core/components/pdotools/model/pdotools/pdofetch.class.php#L373
Добавить в регулярку AS, так как на функции стопроцентно алиас ставиться.
$fields = preg_replace_callback('/\(.*?\bAS\b/i', function($matches) {
return str_replace(",", "|", $matches[0]);
}, $fields);4) $miniShop2 = $modx->getService('miniShop2');
$pdo = $modx->getService("pdoFetch");
$default = [
'includeTVs'=>'in_stock',
'leftJoin'=>[
'Data'=>[
'class'=>'msProductData',
'on'=>'Data.id = modResource.id'
]
],
'select'=>[
'modResource'=>'modResource.id',
],
'sortby'=>'(IF(`Data`.`price` > 0, 1, 0)) DESC, `in_stock` desc',
'setTotal'=>0,
'limit'=>10,
'return'=>'data',
];
$pdo->setConfig($default);
$pdo->run();
echo "<pre>".$pdo->getTime()."</pre>";выдает двойные апострофы в сорт0.0002031: Sorted by (IF(`Data`.`price` > 0, 1, 0)) DESC, ``TVin_stock`.`value`` desc, Преодолел костылем
$sortby = str_replace("``","`",$sortby);после строкиgithub.com/sergant210/pdoTools/blob/daf2e1c2062c2a3080bde221672a43c7dab2e11c/core/components/pdotools/model/pdotools/pdofetch.class.php#L516
Комментарии: 2
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2. Или используем твой вариант с таблицей в виде префикса или такой
Напомню, что можно работать напрямую с запросами через базовый API.
3. Это чудит xPDO. Он формирует запрос, а не pdoFetch. А вообще очень странная конструкция. Я бы так даже не додумался написать. Для сравнения на SQL сервере я бы написал так
Для сравнения на клиенте так
А потом в цикле проверил бы на равенство два последних поля.
Но так как запрос простой и без логики, я бы не стал вообще использовать xPDO, а сделал бы маленький и лёгкий запрос (без кучи объектов xPDO)
В блоке
3.
В курсе. Если select строка, xPDO разбивает select по запятым и затем решает, что 1 это колонка и ставит апострофы.
Блок
вообще не был бы нужен, если бы XPDO не чудила.
У меня pdoTools в компонентах используется, чтобы изменить запрос не трогая сам компонент. Например из excelconvertrule
При экспорте в excel без правок pdoTools на строке
'в дороге' обрамляется апострофами.