pdoTools и JSON поля

В СУБД Mysql 5.7 есть оченннь крутой функционал работы с JSON данными

dev.mysql.com/doc/refman/5.7/en/json.html
Вот видео, стартует с самого интересного
Интересует больше запросы типа WHERE по json

Пример:

Столбец
dop_parms в mysql у таблицы *_site_content, т.е. объект modResource

JSON
{"web":{"show_main":"1","new":"1","discount":"0"}}

При вызове чтобы в where(или можно создать отдельный параметр wherejson) можно было указать поиск например по полю show_main
{'!pdoPage' | snippet :[
    'tpl' => 'product',
    'parents' =>2,
    'wherejson' => 'dop_parms[show_main] = 1' // просто набросал для понимания (не по синтаксису) 
]}

pdoTools насколько я понял не поддерживает поиск по json, или я не правильно думаю?
У кого есть идеи или решения как выкрутиться в таких ситуация?

p.s. Супер было бы если бы Василий добавил поддержку это фичи mySql, я думаю это отличная фича
Константин Ильин
24 января 2018, 12:14
modx.pro
3
2 797
0

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

Алексей Ерохин
24 января 2018, 17:16
+1
В where можно писать чистый SQL
    Константин Ильин
    24 января 2018, 17:48
    0
    Не знал.

    Попробовал разные варианты, но более осмысленный тоже не работает:
    'where' => "JSON_CONTAINS(`dop_parms`, '{\"show_main\":1}')",
    В showLog, а точнее в запросе, отсутствует JSON_CONTAINS
      Алексей Ерохин
      24 января 2018, 18:02
      0
      а если так
      JSON_CONTAINS(`dop_parms`, JSON_OBJECT('show_main',1) )
        Константин Ильин
        24 января 2018, 18:40
        0
        не…

        Нашел другой формат, намного проще и приятнее на вид. Ссылочка
        В начале указывается колонка в которой ищешь, а потом по иерархии идем до нужного поля.

        В консоли запрос отрабатывает на ура
        $result = $modx->query("SELECT * FROM mg_site_content WHERE dop_parms->\"$.show_main\" = '1'");

        А в pdo к сожалению нет…
        'where' => "dop_parms->\"$.show_main\" = '1'",

        Похоже, без Василия не заведется шарманка
    Константин Ильин
    25 января 2018, 01:27
    0
    Извиняюсь конечно, что в топ поднимаю топик, но хотелось бы выдвинуть на серьезное обсуждение данный вопрос
      Сергей Шлоков
      25 января 2018, 08:47
      +1
      pdoTools здесь совершенно не причём. Проблема в xPDO. В нём жестко прописан список доступных SQL функций. И он очень ограничен.
      Я полгода назад послал PR, чтобы можно было расширять этот список, но меня послали в ответ.

      В вашем случае, вы подсовываете просто строку. xPDO ломается при разборе фигурных скобок.
        Сергей Шлоков
        25 января 2018, 09:36
        +1
        Ради интереса прогнал ваш пример с моими правками xPDO. Всё заработало. Так что привет разработчикам xPDO.
          Константин Ильин
          25 января 2018, 13:08
          0
          Повозившись, были две мысли: либо pdoTools, либо xPDO. Теперь все прояснилось, не думал что так все прямолинейно в xPDO, полагал он любые функции sql обрабатывает.

          Напишу им, ибо очень нужная штука.

          Спасибо Сергей!

          Для решение задачи:
          Напишу сниппет с чистым sql который будет возвращать id ресурсов и буду передавать его в pdoResources
            Константин Ильин
            31 января 2018, 23:44
            0
            Currently, we use xPDO::toJSON and xPDO::fromJSON to save the JSON to a text field. I understand MODX3 has a minimum MySQL version of 2.6, I do not know if xPDO has a minimum established, but if it is 2.6 then 2.7 functions may not be possible at this time.

            Если мой английски меня не подводит, он пишет про MODX3 в котором типа все будет, но модх3 мы получим в каком нибудь 2050 году… И то что хер они поддержут в модх 2.7 эти JSON функции
            Пытаюсь, чтобы Ваш PR приняли или хотяб json функции.
              Сергей Шлоков
              01 февраля 2018, 07:38
              0
              Стоит ли удивляться, что MODX теряет популярность. Мало того, что они (разработчики) сами не адаптируют его к новым возможностям, так ещё и когда их просят — посылают. Такое ощущение, что они сами MODX не используют.
              Судя по ответу, человек вообще не понимает, что от него просят. Про какую-то 2.7 пишет, про возможность сохранять JSON, про то, что новые функции могут не работать. Он даже не понял, что PR не функции добавляет, а возможность разработчику самому указывать нужные функции. В общем, ещё один привет этим разработчикам.
              В этом ключе забавно слушать призывы активнее участвовать в разработке и поддержке MODX. Для чего? Чтобы тебя вот так отбривали?

              П.С. С Ларавел, кстати, другая крайность. Каждые полгода выходит новая версия, часто несовместимая с предыдущей. Соответственно и дополнения нужно подгонять для новой версии.
                Константин Ильин
                01 февраля 2018, 08:56
                0
                Тоже вчера пришел и минут 10 смотрел, соображал, что за кашу он написал. Как будто человек пьяный писал или ответ менеджера.
                Тоже не совсем понял про какие версии он пишет. Он вообще пишет «MySQL version of 2.6» — это из какого века человек?

                Судя по ответу, человек вообще не понимает, что от него просят.
                Она наверно даже не зашел по ссылке по JSON поля.

                П.С. С Ларавел, кстати, другая крайность. Каждые полгода выходит новая версия, часто несовместимая с предыдущей. Соответственно и дополнения нужно подгонять для новой версии.
                Ого, я в будущем планировал за него зацепится, но видать не стоит.

                В этом ключе забавно слушать призывы активнее участвовать в разработке и поддержке MODX. Для чего? Чтобы тебя вот так отбривали?
                Противоречат сами себе или мы не обладаем достаточным авторитетом чтобы чего-то там советовать. Зазнались наверно…

                Приходится велосипедить теперь, писать чистые sql, получать id ресурсов и передавать в pdoPage…
                Еще раз напишу, попробую донести до него или пойду выше другим писать — ибо нехер.
                  Сергей Шлоков
                  01 февраля 2018, 10:06
                  0
                  Ого, я в будущем планировал за него зацепится, но видать не стоит.
                  Да стоит. К нему надо относится как к Windows. Кто-то на 7-ке сидит, кто-то на 8-ке, кто-то на 10-ке. И все поддерживаются. Также и Ларавел. В феврале выходит версия 5.6. Версия 5.5 уже требует PHP 7. Но многие ещё продолжают работать с 5.2.

                  Приходится велосипедить теперь, писать чистые sql, получать id ресурсов и передавать в pdoPage…
                  У меня была мысль прикрутить Doctrine или Eloquent вместо xPDO (в смысле сделать пакет). Но тут должен быть запрос общества и готовность это использовать. А делать, чтобы просто было, желания нету. Поэтому отказался. А у этих ORM возможности куда круче. И безопасные и гибкие. Как минимум не надо никаких схем — создал таблицу, класс и юзай сразу же.
                  Красота
                  // Пример QueryBuilder
                  $users = DB::table('users')
                                       ->select(DB::raw('count(*) as user_count, status'))
                                       ->where('status', '<>', 1)
                                       ->groupBy('status')
                                       ->get();
                  //Пример ORM
                  $users = User::where('active', 1)
                                 ->orderBy('username', 'desc')
                                 ->take(10)
                                 ->get();

                  Еще раз напишу, попробую донести до него или пойду выше другим писать — ибо нехер.
                  Сразу Джейсону (opengeek) — чё за дела, бро? :)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          12