Помогите разобраться с FIND_IN_SET
Всем доброго времени суток!
Решил научиться выводить и сортировать ресурсы MODX, для этого воспользовался инструкцией modx.pro/development/3144-a-couple-of-tricks-with-xpdo/, встала задача отсортировать ненужные ресурсы по тегам, теги хранятся в поле from_city через разделитель «Запятая». Но как правильно составить запрос не пойму. Помогите разобраться)
Поле from_city не ТВ и было добавлено с помощью плагина modx.pro/solutions/7037-expanding-any-table-modx/
На данный момент все выглядит так и результат нулевой:
Решил научиться выводить и сортировать ресурсы MODX, для этого воспользовался инструкцией modx.pro/development/3144-a-couple-of-tricks-with-xpdo/, встала задача отсортировать ненужные ресурсы по тегам, теги хранятся в поле from_city через разделитель «Запятая». Но как правильно составить запрос не пойму. Помогите разобраться)
Поле from_city не ТВ и было добавлено с помощью плагина modx.pro/solutions/7037-expanding-any-table-modx/
На данный момент все выглядит так и результат нулевой:
$param['parent'] = 6;
$param['where'] = ["1 = 1 AND FIND_IN_SET('Москва', from_city)"];
$params = array_diff($param, array(''));
$q = $modx->newQuery('modResource', $params);
$q->limit(1000);
$q->prepare();
$q->stmt->execute();
$res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $v) {
echo $v['modResource_pagetitle'];
}
Комментарии: 29
["1 = 1 AND FIND_IN_SET('Москва', from_city)"]
Что Вы хотели этим сделать?
Мне нужно вывести ресурс со значением «Москва», у ресурса есть поле с таким значениями «Москва, СПБ»)
from_city — ТВ? Посмотрите, где лежат ресурсы и где ТВ. На чистом pdo их джойнить надо, а потом LIKE %Москва% в нужном поле
поле from_city не tv, это поле добавлено в базу руками. По поводу LIKE знаю, но проблема в том что вывод будет не по точному значению
Руками в базу? Таблицу modResource, как и другие родные таблицы никто не трогает, т.к.:
1) Нужно править карту modResource. Mysql знает о новой колонке, а modx нет.
2) При обновлении все затрется (я о карте говорю)
3) Для Вашей задачи есть ТВ
1) Нужно править карту modResource. Mysql знает о новой колонке, а modx нет.
2) При обновлении все затрется (я о карте говорю)
3) Для Вашей задачи есть ТВ
Дело в том что мне не нужно выводить это поле в админке, только в базе а именно в modx_site_content. А для того чтобы это поле работало я воспользовался плагином Василия modx.pro/solutions/7037-expanding-any-table-modx/ по этому я и не использую TV
Вы про расширение плагином ничего не писали. Ошибки в логах есть?
про плагин думал не обязательно) а ошибок нет
Я обычно начинаю дебажить с SQL запросом.
$q->prepare();
echo $q->toSql();
Выводит SQL, залезаете в phpmyadmin — тестируете, скорее всего неправильно составлен SQL запрос WHERE ( `modResource`.`parent` = 6 AND `modResource`.`where` = )
Строчку [«1 = 1 AND FIND_IN_SET('Москва', from_city)»] modx не может скушать.
да скорее всего я не правильно составляю этот запрос, но как составить верно не пойму) я только начал изучать)
1=1 сам по себе бессмысленный запрос, уберите.
WHERE `modResource`.`from_city` LIKE '%Москва,%'
echo $q->toSql() сюда
что то я подвис, не пойму что сделать) 1=1 убрал
$param['parent'] = 6;
$param['from_city:LIKE'] = '%Москва,%';
$params = array_diff($param, array(''));
$q = $modx->newQuery('modResource', $params);
$q->limit(1000);
$q->prepare();
echo $q->toSql()
$q->stmt->execute();
$res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $v) {
echo $v['modResource_pagetitle'];
}
к сожаление ничего не выдает, но тут же LIKE)
если с помощью LIKE фильтровать то я делал так
если с помощью LIKE фильтровать то я делал так
$param['from_city:LIKE'] = '%'.Москва.'%';
я не знаю, чем Вам не нравится LIKE, запятую к последнему % добавляете и не будет как с примером /10/100/1000.
Ничего не может не вывести, там toSQL, у меня выводит:
Ничего не может не вывести, там toSQL, у меня выводит:
SELECT `modResource`.`id` AS `modResource_id`, `modResource`.`type` AS `modResource_type`, `modResource`.`contentType` AS `modResource_contentType`, `modResource`.`pagetitle` AS `modResource_pagetitle`, `modResource`.`longtitle` AS `modResource_longtitle`, `modResource`.`description` AS `modResource_description`, `modResource`.`alias` AS `modResource_alias`, `modResource`.`link_attributes` AS `modResource_link_attributes`, `modResource`.`published` AS `modResource_published`, `modResource`.`pub_date` AS `modResource_pub_date`, `modResource`.`unpub_date` AS `modResource_unpub_date`, `modResource`.`parent` AS `modResource_parent`, `modResource`.`isfolder` AS `modResource_isfolder`, `modResource`.`introtext` AS `modResource_introtext`, `modResource`.`content` AS `modResource_content`, `modResource`.`richtext` AS `modResource_richtext`, `modResource`.`template` AS `modResource_template`, `modResource`.`menuindex` AS `modResource_menuindex`, `modResource`.`searchable` AS `modResource_searchable`, `modResource`.`cacheable` AS `modResource_cacheable`, `modResource`.`createdby` AS `modResource_createdby`, `modResource`.`createdon` AS `modResource_createdon`, `modResource`.`editedby` AS `modResource_editedby`, `modResource`.`editedon` AS `modResource_editedon`, `modResource`.`deleted` AS `modResource_deleted`, `modResource`.`deletedon` AS `modResource_deletedon`, `modResource`.`deletedby` AS `modResource_deletedby`, `modResource`.`publishedon` AS `modResource_publishedon`, `modResource`.`publishedby` AS `modResource_publishedby`, `modResource`.`menutitle` AS `modResource_menutitle`, `modResource`.`donthit` AS `modResource_donthit`, `modResource`.`privateweb` AS `modResource_privateweb`, `modResource`.`privatemgr` AS `modResource_privatemgr`, `modResource`.`content_dispo` AS `modResource_content_dispo`, `modResource`.`hidemenu` AS `modResource_hidemenu`, `modResource`.`class_key` AS `modResource_class_key`, `modResource`.`context_key` AS `modResource_context_key`, `modResource`.`content_type` AS `modResource_content_type`, `modResource`.`uri` AS `modResource_uri`, `modResource`.`uri_override` AS `modResource_uri_override`, `modResource`.`hide_children_in_tree` AS `modResource_hide_children_in_tree`, `modResource`.`show_in_tree` AS `modResource_show_in_tree`, `modResource`.`properties` AS `modResource_properties` FROM `modx_site_content` AS `modResource` WHERE ( `modResource`.`parent` = 6 AND `modResource`.`from_city` LIKE '%Москва,%' ) LIMIT 1000
способ вроде рабочий, только правильно ли писать %Москва,% оставляя запятую?
что в этом не правильно?
У Вас теги полные, или частичные. По точному совпадению — запятые, по частичному — запятые не нужны
У Вас теги полные, или частичные. По точному совпадению — запятые, по частичному — запятые не нужны
теги полные, так все работает просто запятая выглядит как хак) пока так и оставлю, спасибо за помощь)
Да, кривой хак, если значение будет одно, оно не выведется, ибо запятой нет
FIND_IN_SET вообще возвращает значение не то…
Возвращает 0, если str не найдена среди строк в strlist. Возвращает NULL, если один из аргументов NULL.Заносите теги в кавычки, будет Вам счастье…
$param['from_city:LIKE'] = '%"Москва"%';
Разумеется, в базе все значения в кавычках храните
понял, но пока буду пробовать) все же как то в статье modx.pro/development/7236-pdofetch-search-in-tv-fields-with-the-delimiter/ это реализовали
$q = $modx->newQuery('modResource', array(
'parent' => 6,
'from_city:FIND_IN_SET ' => 'Москва, from_city',
));
$q->limit(1000);
$q->prepare();
echo $q->toSql();
Результат:WHERE ( `modResource`.`parent` = 6 AND `modResource`.`from_city` FIND_IN_SET 'Москва, from_city' )
Вы вроде не туда полезли. Смотрите документацию pdoResource, там отлично все сортируется
про pdoResource тоже читал и он может сортировать результат как раз пример есть тут modx.pro/development/7236-pdofetch-search-in-tv-fields-with-the-delimiter/ но как применить это в моей варианте и не знаю(
Что значит
Пример привести можете?
По поводу LIKE знаю, но проблема в том что вывод будет не по точному значению?
Пример привести можете?
К примеру у меня будут не города а значения «10,100,1000» если я попытаюсь отфильтровать 10 с помощью LIKE то мне выпадут ресурсы со значениями 10,100,1000 так как 10 частично совпадает с другими значениями)
Я просто не понимаю, в тикете у Вас разделение ||, а в базе запятая?
блин, это я ошибся я заменил || на запятую
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.