Совсем уж стыдно, но тем не менее - не могу сделать выборку where по значению TV

Есть ресурс, у него TV типа селект с именем is_present, со значением 0 или 1
Делаю
{'!pdoResources'|snippet:[
 'tpl'=>'',                      
'includeTVs'=>'is_present',
'tvPrefix'=>'',
'showLog'=>1
]}
вижу что is_present присутствует, вижу что у некоторых он 0 у некоторых 1;
Делаю выборку с условием
{'!pdoResources'|snippet:[
                        'tpl'=>'@FILE tpl/oneProduct.tpl1',
                        'limit'=>400,
                        'includeTVs'=>'is_present',
                        'tvPrefix'=>'',

                            'where'=>['is_present'=>1],


                        'sortby'=>'menuindex',
                        'showLog'=>1
                        ]}
в выборке пусто.
Вот лог.
0.0001311: pdoTools loaded
0.0000520: xPDO query object created
0.0006349: Included list of tvs: is_present
0.0004339: leftJoined modTemplateVarResource as TVis_present
0.0003412: Added selection of modResource: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000169: Added selection of modTemplateVarResource: IFNULL(`value`, '1') AS `is_present`
0.0000439: Replaced TV conditions
0.0012050: Processed additional conditions
0.0016990: Added where condition: `TVis_present`.`value`=1, modResource.parent:IN(4,12,5), modResource.published=1, modResource.deleted=0
0.0000060: Replaced TV conditions
0.0001640: Sorted by modResource.menuindex, DESC
0.0000031: Limited to 400, offset 0
0.0003979: SQL prepared "SELECT `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`alias_visible`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, IFNULL(`TVis_present`.`value`, '1') AS `is_present` FROM `modxo_site_content` AS `modResource` LEFT JOIN `modxo_site_tmplvar_contentvalues` `TVis_present` ON `TVis_present`.`contentid` = `modResource`.`id` AND `TVis_present`.`tmplvarid` = 8 WHERE  ( `TVis_present`.`value` = '1' AND `modResource`.`parent` IN (4,12,5) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 )  ORDER BY modResource.menuindex DESC LIMIT 400 "
0.0010910: SQL executed
0.0000091: Rows fetched
0.0000160: Prepared and processed TVs
0.0000019: Returning processed chunks
0.0051711: Total time
4 194 304: Memory usage
Кстати вот не знаю, такой синтаксис это нормально — Added where condition: `TVis_present`. ??
И вроде бы раньше вот такого where мне всегда хватало, но иду далее, вспоминаю за довольно странные штуки — prepareTVs и includeTVs. Добавляю их.
В выборке пусто, вот лог
0.0001271: pdoTools loaded
0.0000410: xPDO query object created
0.0010030: Included list of tvs: is_present
0.0003901: leftJoined modTemplateVarResource as TVis_present
0.0003831: Added selection of modResource: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000110: Added selection of modTemplateVarResource: IFNULL(`value`, '1') AS `is_present`
0.0000422: Replaced TV conditions
0.0019372: Processed additional conditions
0.0024281: Added where condition: `TVis_present`.`value`=1, modResource.parent:IN(4,12,5), modResource.published=1, modResource.deleted=0
0.0000069: Replaced TV conditions
0.0002670: Sorted by modResource.menuindex, DESC
0.0000038: Limited to 400, offset 0
0.0005360: SQL prepared "SELECT `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`alias_visible`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, IFNULL(`TVis_present`.`value`, '1') AS `is_present` FROM `modxo_site_content` AS `modResource` LEFT JOIN `modxo_site_tmplvar_contentvalues` `TVis_present` ON `TVis_present`.`contentid` = `modResource`.`id` AND `TVis_present`.`tmplvarid` = 8 WHERE  ( `TVis_present`.`value` = '1' AND `modResource`.`parent` IN (4,12,5) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 )  ORDER BY modResource.menuindex DESC LIMIT 400 "
0.0024400: SQL executed
0.0000160: Rows fetched
0.0000579: Prepared and processed TVs
0.0000010: Returning processed chunks
0.0078900: Total time
4 194 304: Memory usage
И опять таки везде мелькает «TVis_presen» что немного напрягает, но может и зря.
Вспоминаю, что вместо синтаксиса «php массива» можно в where передать json. Делаю.
{'!pdoResources'|snippet:[
                        'tpl'=>'',
                      
                        'includeTVs'=>'is_present',
                        'tvPrefix'=>'',
                            'processTVs'=>1,
                            'prepareTVs'=>1,

                            'where'=>'{"is_present":"1"}',


                        'sortby'=>'menuindex',
                        'showLog'=>1
                        ]}
И снова в выборке ничего. Вот лог
0.0001400: pdoTools loaded
0.0000429: xPDO query object created
0.0010090: Included list of tvs: is_present
0.0004029: leftJoined modTemplateVarResource as TVis_present
0.0003691: Added selection of modResource: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000112: Added selection of modTemplateVarResource: IFNULL(`value`, '1') AS `is_present`
0.0000410: Replaced TV conditions
0.0018580: Processed additional conditions
0.0023530: Added where condition: `TVis_present`.`value`=1, modResource.parent:IN(4,12,5), modResource.published=1, modResource.deleted=0
0.0000069: Replaced TV conditions
0.0002670: Sorted by modResource.menuindex, DESC
0.0000041: Limited to 400, offset 0
0.0005271: SQL prepared "SELECT `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`alias_visible`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, IFNULL(`TVis_present`.`value`, '1') AS `is_present` FROM `modxo_site_content` AS `modResource` LEFT JOIN `modxo_site_tmplvar_contentvalues` `TVis_present` ON `TVis_present`.`contentid` = `modResource`.`id` AND `TVis_present`.`tmplvarid` = 8 WHERE  ( `TVis_present`.`value` = '1' AND `modResource`.`parent` IN (4,12,5) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 )  ORDER BY modResource.menuindex DESC LIMIT 400 "
0.0016739: SQL executed
0.0000200: Rows fetched
0.0000160: Prepared and processed TVs
0.0000010: Returning processed chunks
0.0070190: Total time
4 194 304: Memory usage
Ну и собственно пока идеи и закончились. Если что ресурсы это товары, но при использовании сниппета msProducts все один в один.
Попробую правда еще без шаблонизатора, а через синтаксис [[!pdoResources]]
Знаю же, что просто устал и торможу, но буду рад подсказке.
Александр Мельник
27 февраля 2020, 17:34
modx.pro
779
0

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

Александр Мельник
27 февраля 2020, 17:57
0
{ignore}
                        [[!pdoResources?
                        &tpl=``
                        &includeTVs=`is_present`
                        &tvPrefix=``
                        &where=`{"is_present":"1"}`
                        ]]
{/ignore}
такой вызов также ничего не находит
Хотя без указания where вижу что есть ресурсы с 0 и есть с 1
    Александр Мельник
    27 февраля 2020, 19:52
    0
    Мой маразм крепчает.
    Господа, а вот значения ТВ по умолчанию, они как хранятся?
    К примеру я создал ТВ у которого варианты 1 или 0. И говорю что по умолчанию — 1.
    И все работает супер, при создании ресурса значение по умолчанию отображается.
    Но тут начинается интересное — в базе оно отсутствует.
    Насколько я понимаю для хранения соответствия между ресурсами и значениями ТВ используется таблица site_tmplvar_contentvalues
    и что самое интересное — в ней нет значений по умолчанию. Тоесть я создал ресурс с id = 100 и к нему прикреплен ТВ с id =30 у которого задано значение по умолчанию, то эта связь не попадает в таблицу.
    И вот ответ почему я не могу сделать выборку по значениям ТВ.
    Но если пойти в ресурс и сменить значение по умолчанию на другое, сохранить, то в таблице site_tmplvar_contentvalues прекрасная запись возникает и сразу по этому значению выборка начинает работать.
    Дальше лучше, если снова у ресурса выставить значение по умолчанию, то строка в таблице site_tmplvar_contentvalues исчезает.
    Разве так и раньше было? Что-то очень это странно.
    Получается я выставил значения по умолчанию у тв, чтобы облегчить заполнение, но сам себя лишил возможности полноценно с ними работать и делать выборки.
    Кто еще сталкивался? Что это — глюк или так и было всегда?
    забыл добавить — но при это значение по умолчанию этой твишки я могу вывести в шаблоне и так далее, но не использовать в выборке(
      Артем
      27 февраля 2020, 20:20
      +1
      Конечно, значения по умолчанию в БД не будет, откуда ему там взяться?
      Представьте, что у вас 50000 ресурсов и вы добавили значение по умолчанию, не будут же они проставляться для 50000 ресурсов, логично?

      Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_text

      Делайте исключающую выборку через :!=
        Александр Мельник
        27 февраля 2020, 20:26
        0
        Вот видите я не знал о таком нюансе, считая что раз есть значение по умолчанию то с ним можно полноценно работать во всех смыслах это слова, в том числе и для построения условия.
        Исключающая выборка для меня не вариант. К примеру, у ТВ есть значения 0 и 1. По умолчанию 1.
        А мне на странице нужно вывести сначала все у кого она =1, а потом все у кого она равна = 0.
        Но и та и другая выборка дает пустой результат, поскольку в таблице site_tmplvar_contentvalues вообще нет записей о моем ресурсе.
          Артем
          27 февраля 2020, 20:33
          +1
          ну так все правильно, значения у этих тв не менялись, что выводить-то?

          еще раз, значение по умолчанию сделано не для выборки по нему, оно не добавляется в базу, наоборот, если установлено такое значение, то оно удаляется из базы, потому что оно «по умолчанию».

          из этого следует, что если вы ставите значение по умолчанию 1, то оно никогда не попадет в бд
          следовательно, если значения в бд нет, то значит оно = 1, если есть, то 0
            Александр Мельник
            27 февраля 2020, 21:30
            0
            Да, спасибо.
            Я вывел уже опытно-эмпирическим путем, что значение по умолчанию — оно не для выборки. Просто не знал об этом раньше.

            Но раз уж мы тут собрались, то у меня возникла еще одна проблема, причем вполне подозреваю, что я тоже не знаю каких то нюансов.
            Опишу, может подскажите.

            Есть товар. Есть несколько опций созданных в настройках minishop и привязанных к категории, в которой товар. Заполнили опции значениями. Сохранили товар. На странице опции выводятся совсем уж просто
            {'!msProductOptions'|snippet:[
                                            'tpl'=>'@FILE tpl/optionsList.tpl'
                                            ]}
            Они роскошно выводятся. Но тут менеджер берет и ставит на вкладке — Категории у этого товара галочку для привязки его к другой категории. Товар продолжает отображаться как был, все ок — но больше ни одного значения характеристики нет.
            Сначала решили что это потому, что у категории, куда мы его виртуально поместили не привязаны эти же опции. привязали. Снова ничего. Страница товара открывается, товар физически лежит в той категории где и нужно, но опций нет (имеется ввиду не выводятся сниппетом, в админке то они есть и заполнены.)
            Убираем галочки, снимаем привязку к другой категории и вуаля — сразу на странице вывелись все опции.
            Нет идей? Было бы интересно.
              Сергей Шлоков
              28 февраля 2020, 09:23
              0
              Я вывел уже опытно-эмпирическим путем, что значение по умолчанию — оно не для выборки.
              Ну для разрабов, не знающих SQL, справедливо. Для остальных сделать 2 джойна вместо includeTVs (который, кстати, делает тот же джойн) как 2 пальца…
              Сергей Шлоков
              28 февраля 2020, 09:16
              0
              еще раз, значение по умолчанию сделано не для выборки по нему, оно не добавляется в базу
              Правда? А где же оно хранится?
                Артем
                28 февраля 2020, 13:50
                0
                Я выше вполне себе ясно написал, где оно хранится.

                Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_text
                Очевидно, что здесь идет речь о том, что оно не добавляется в modTemplateVarResource.
          Сергей Шлоков
          27 февраля 2020, 20:24
          0
          Много раз уже это обсуждалось… Дефолтное значение TV хранится в таблице modx_site_tmplvars, а сами значения в modx_tmplvar_contentvalues. Где-то у Боба Рэя инструкция валялась по работе с TV с этим учётом.
          Сергей Шлоков
          27 февраля 2020, 20:27
          0
          WHERE  ( `TVis_present`.`value` = '1' ...
          Разве не работает?
            Александр Мельник
            27 февраля 2020, 20:31
            0
            о боже, откуда вы это нашли) Попробую, правда уже несколько переписал логику работы.
            Но для развития нужно опробовать. Каюсь, я писал почти так же как и вы (поняв из логов что TVis_present это что то типа псевдонима ), но я писал так — 'where' => ['TVis_present.is_present' => 1]
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            12