Помогите разобраться с 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/

На данный момент все выглядит так и результат нулевой:

$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'];
}
Максим
10 августа 2017, 11:47
modx.pro
1 812
0

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

Александр
10 августа 2017, 16:13
0
["1 = 1 AND FIND_IN_SET('Москва', from_city)"]
Что Вы хотели этим сделать?
    Максим
    10 августа 2017, 16:16
    0
    Мне нужно вывести ресурс со значением «Москва», у ресурса есть поле с таким значениями «Москва, СПБ»)
      Александр
      10 августа 2017, 16:17
      0
      from_city — ТВ? Посмотрите, где лежат ресурсы и где ТВ. На чистом pdo их джойнить надо, а потом LIKE %Москва% в нужном поле
        Максим
        10 августа 2017, 16:20
        0
        поле from_city не tv, это поле добавлено в базу руками. По поводу LIKE знаю, но проблема в том что вывод будет не по точному значению
          Александр
          10 августа 2017, 16:28
          0
          Руками в базу? Таблицу modResource, как и другие родные таблицы никто не трогает, т.к.:
          1) Нужно править карту modResource. Mysql знает о новой колонке, а modx нет.
          2) При обновлении все затрется (я о карте говорю)
          3) Для Вашей задачи есть ТВ
            Максим
            10 августа 2017, 16:45
            0
            Дело в том что мне не нужно выводить это поле в админке, только в базе а именно в modx_site_content. А для того чтобы это поле работало я воспользовался плагином Василия modx.pro/solutions/7037-expanding-any-table-modx/ по этому я и не использую TV
              Александр
              10 августа 2017, 17:11
              0
              Вы про расширение плагином ничего не писали. Ошибки в логах есть?
                Максим
                10 августа 2017, 17:22
                0
                про плагин думал не обязательно) а ошибок нет
                Александр
                10 августа 2017, 17:13
                0
                Я обычно начинаю дебажить с SQL запросом.
                $q->prepare();
                echo $q->toSql();
                Выводит SQL, залезаете в phpmyadmin — тестируете, скорее всего неправильно составлен SQL запрос
                  Александр
                  10 августа 2017, 17:15
                  0
                  WHERE ( `modResource`.`parent` = 6 AND `modResource`.`where` = )
                  Строчку [«1 = 1 AND FIND_IN_SET('Москва', from_city)»] modx не может скушать.
                    Максим
                    10 августа 2017, 17:20
                    0
                    да скорее всего я не правильно составляю этот запрос, но как составить верно не пойму) я только начал изучать)
                      Александр
                      10 августа 2017, 17:30
                      0
                      1=1 сам по себе бессмысленный запрос, уберите.
                      WHERE `modResource`.`from_city` LIKE '%Москва,%'
                      echo $q->toSql() сюда
                        Максим
                        10 августа 2017, 17:37
                        0
                        что то я подвис, не пойму что сделать) 1=1 убрал
                          Александр
                          10 августа 2017, 17:39
                          0
                          $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'];
                          }
                          Максим
                          10 августа 2017, 17:43
                          0
                          к сожаление ничего не выдает, но тут же LIKE)
                          если с помощью LIKE фильтровать то я делал так
                          $param['from_city:LIKE'] = '%'.Москва.'%';
                          Александр
                          10 августа 2017, 17:47
                          0
                          я не знаю, чем Вам не нравится LIKE, запятую к последнему % добавляете и не будет как с примером /10/100/1000.
                          Ничего не может не вывести, там 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
                          Максим
                          10 августа 2017, 17:48
                          0
                          способ вроде рабочий, только правильно ли писать %Москва,% оставляя запятую?
                          Александр
                          10 августа 2017, 17:58
                          0
                          что в этом не правильно?
                          У Вас теги полные, или частичные. По точному совпадению — запятые, по частичному — запятые не нужны
                          Максим
                          10 августа 2017, 18:02
                          0
                          теги полные, так все работает просто запятая выглядит как хак) пока так и оставлю, спасибо за помощь)
                          Александр
                          10 августа 2017, 18:04
                          0
                          Да, кривой хак, если значение будет одно, оно не выведется, ибо запятой нет
                          Александр
                          10 августа 2017, 18:08
                          0
                          FIND_IN_SET вообще возвращает значение не то…
                          Возвращает 0, если str не найдена среди строк в strlist. Возвращает NULL, если один из аргументов NULL.
                          Заносите теги в кавычки, будет Вам счастье…
                          $param['from_city:LIKE'] = '%"Москва"%';
                          Разумеется, в базе все значения в кавычках храните
                          Максим
                          10 августа 2017, 18:12
                          0
                          понял, но пока буду пробовать) все же как то в статье modx.pro/development/7236-pdofetch-search-in-tv-fields-with-the-delimiter/ это реализовали
                          Александр
                          10 августа 2017, 18:01
                          0
                          $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' )
          Александр
          10 августа 2017, 16:19
          0
          Вы вроде не туда полезли. Смотрите документацию pdoResource, там отлично все сортируется
            Максим
            10 августа 2017, 16:24
            0
            про pdoResource тоже читал и он может сортировать результат как раз пример есть тут modx.pro/development/7236-pdofetch-search-in-tv-fields-with-the-delimiter/ но как применить это в моей варианте и не знаю(
              Александр
              10 августа 2017, 16:30
              0
              Что значит
              По поводу LIKE знаю, но проблема в том что вывод будет не по точному значению
              ?

              Пример привести можете?
                Максим
                10 августа 2017, 16:38
                0
                К примеру у меня будут не города а значения «10,100,1000» если я попытаюсь отфильтровать 10 с помощью LIKE то мне выпадут ресурсы со значениями 10,100,1000 так как 10 частично совпадает с другими значениями)
                  Александр
                  10 августа 2017, 17:09
                  0
                  Я просто не понимаю, в тикете у Вас разделение ||, а в базе запятая?
                    Максим
                    10 августа 2017, 17:15
                    0
                    блин, это я ошибся я заменил || на запятую
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        29