Совсем уж стыдно, но тем не менее - не могу сделать выборку where по значению TV
Есть ресурс, у него TV типа селект с именем is_present, со значением 0 или 1
Делаю
Делаю выборку с условием
Вот лог.
И вроде бы раньше вот такого where мне всегда хватало, но иду далее, вспоминаю за довольно странные штуки — prepareTVs и includeTVs. Добавляю их.
В выборке пусто, вот лог
Вспоминаю, что вместо синтаксиса «php массива» можно в where передать json. Делаю.
Попробую правда еще без шаблонизатора, а через синтаксис [[!pdoResources]]
Знаю же, что просто устал и торможу, но буду рад подсказке.
Делаю
{'!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]]
Знаю же, что просто устал и торможу, но буду рад подсказке.
Комментарии: 12
Мой маразм крепчает.
Господа, а вот значения ТВ по умолчанию, они как хранятся?
К примеру я создал ТВ у которого варианты 1 или 0. И говорю что по умолчанию — 1.
И все работает супер, при создании ресурса значение по умолчанию отображается.
Но тут начинается интересное — в базе оно отсутствует.
Насколько я понимаю для хранения соответствия между ресурсами и значениями ТВ используется таблица site_tmplvar_contentvalues
и что самое интересное — в ней нет значений по умолчанию. Тоесть я создал ресурс с id = 100 и к нему прикреплен ТВ с id =30 у которого задано значение по умолчанию, то эта связь не попадает в таблицу.
И вот ответ почему я не могу сделать выборку по значениям ТВ.
Но если пойти в ресурс и сменить значение по умолчанию на другое, сохранить, то в таблице site_tmplvar_contentvalues прекрасная запись возникает и сразу по этому значению выборка начинает работать.
Дальше лучше, если снова у ресурса выставить значение по умолчанию, то строка в таблице site_tmplvar_contentvalues исчезает.
Разве так и раньше было? Что-то очень это странно.
Получается я выставил значения по умолчанию у тв, чтобы облегчить заполнение, но сам себя лишил возможности полноценно с ними работать и делать выборки.
Кто еще сталкивался? Что это — глюк или так и было всегда?
забыл добавить — но при это значение по умолчанию этой твишки я могу вывести в шаблоне и так далее, но не использовать в выборке(
Господа, а вот значения ТВ по умолчанию, они как хранятся?
К примеру я создал ТВ у которого варианты 1 или 0. И говорю что по умолчанию — 1.
И все работает супер, при создании ресурса значение по умолчанию отображается.
Но тут начинается интересное — в базе оно отсутствует.
Насколько я понимаю для хранения соответствия между ресурсами и значениями ТВ используется таблица site_tmplvar_contentvalues
и что самое интересное — в ней нет значений по умолчанию. Тоесть я создал ресурс с id = 100 и к нему прикреплен ТВ с id =30 у которого задано значение по умолчанию, то эта связь не попадает в таблицу.
И вот ответ почему я не могу сделать выборку по значениям ТВ.
Но если пойти в ресурс и сменить значение по умолчанию на другое, сохранить, то в таблице site_tmplvar_contentvalues прекрасная запись возникает и сразу по этому значению выборка начинает работать.
Дальше лучше, если снова у ресурса выставить значение по умолчанию, то строка в таблице site_tmplvar_contentvalues исчезает.
Разве так и раньше было? Что-то очень это странно.
Получается я выставил значения по умолчанию у тв, чтобы облегчить заполнение, но сам себя лишил возможности полноценно с ними работать и делать выборки.
Кто еще сталкивался? Что это — глюк или так и было всегда?
забыл добавить — но при это значение по умолчанию этой твишки я могу вывести в шаблоне и так далее, но не использовать в выборке(
Конечно, значения по умолчанию в БД не будет, откуда ему там взяться?
Представьте, что у вас 50000 ресурсов и вы добавили значение по умолчанию, не будут же они проставляться для 50000 ресурсов, логично?
Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_text
Делайте исключающую выборку через :!=
Представьте, что у вас 50000 ресурсов и вы добавили значение по умолчанию, не будут же они проставляться для 50000 ресурсов, логично?
Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_text
Делайте исключающую выборку через :!=
Вот видите я не знал о таком нюансе, считая что раз есть значение по умолчанию то с ним можно полноценно работать во всех смыслах это слова, в том числе и для построения условия.
Исключающая выборка для меня не вариант. К примеру, у ТВ есть значения 0 и 1. По умолчанию 1.
А мне на странице нужно вывести сначала все у кого она =1, а потом все у кого она равна = 0.
Но и та и другая выборка дает пустой результат, поскольку в таблице site_tmplvar_contentvalues вообще нет записей о моем ресурсе.
Исключающая выборка для меня не вариант. К примеру, у ТВ есть значения 0 и 1. По умолчанию 1.
А мне на странице нужно вывести сначала все у кого она =1, а потом все у кого она равна = 0.
Но и та и другая выборка дает пустой результат, поскольку в таблице site_tmplvar_contentvalues вообще нет записей о моем ресурсе.
ну так все правильно, значения у этих тв не менялись, что выводить-то?
еще раз, значение по умолчанию сделано не для выборки по нему, оно не добавляется в базу, наоборот, если установлено такое значение, то оно удаляется из базы, потому что оно «по умолчанию».
из этого следует, что если вы ставите значение по умолчанию 1, то оно никогда не попадет в бд
следовательно, если значения в бд нет, то значит оно = 1, если есть, то 0
еще раз, значение по умолчанию сделано не для выборки по нему, оно не добавляется в базу, наоборот, если установлено такое значение, то оно удаляется из базы, потому что оно «по умолчанию».
из этого следует, что если вы ставите значение по умолчанию 1, то оно никогда не попадет в бд
следовательно, если значения в бд нет, то значит оно = 1, если есть, то 0
Да, спасибо.
Я вывел уже опытно-эмпирическим путем, что значение по умолчанию — оно не для выборки. Просто не знал об этом раньше.
Но раз уж мы тут собрались, то у меня возникла еще одна проблема, причем вполне подозреваю, что я тоже не знаю каких то нюансов.
Опишу, может подскажите.
Есть товар. Есть несколько опций созданных в настройках minishop и привязанных к категории, в которой товар. Заполнили опции значениями. Сохранили товар. На странице опции выводятся совсем уж просто
Сначала решили что это потому, что у категории, куда мы его виртуально поместили не привязаны эти же опции. привязали. Снова ничего. Страница товара открывается, товар физически лежит в той категории где и нужно, но опций нет (имеется ввиду не выводятся сниппетом, в админке то они есть и заполнены.)
Убираем галочки, снимаем привязку к другой категории и вуаля — сразу на странице вывелись все опции.
Нет идей? Было бы интересно.
Я вывел уже опытно-эмпирическим путем, что значение по умолчанию — оно не для выборки. Просто не знал об этом раньше.
Но раз уж мы тут собрались, то у меня возникла еще одна проблема, причем вполне подозреваю, что я тоже не знаю каких то нюансов.
Опишу, может подскажите.
Есть товар. Есть несколько опций созданных в настройках minishop и привязанных к категории, в которой товар. Заполнили опции значениями. Сохранили товар. На странице опции выводятся совсем уж просто
{'!msProductOptions'|snippet:[
'tpl'=>'@FILE tpl/optionsList.tpl'
]}
Они роскошно выводятся. Но тут менеджер берет и ставит на вкладке — Категории у этого товара галочку для привязки его к другой категории. Товар продолжает отображаться как был, все ок — но больше ни одного значения характеристики нет. Сначала решили что это потому, что у категории, куда мы его виртуально поместили не привязаны эти же опции. привязали. Снова ничего. Страница товара открывается, товар физически лежит в той категории где и нужно, но опций нет (имеется ввиду не выводятся сниппетом, в админке то они есть и заполнены.)
Убираем галочки, снимаем привязку к другой категории и вуаля — сразу на странице вывелись все опции.
Нет идей? Было бы интересно.
Я вывел уже опытно-эмпирическим путем, что значение по умолчанию — оно не для выборки.Ну для разрабов, не знающих SQL, справедливо. Для остальных сделать 2 джойна вместо includeTVs (который, кстати, делает тот же джойн) как 2 пальца…
еще раз, значение по умолчанию сделано не для выборки по нему, оно не добавляется в базуПравда? А где же оно хранится?
Я выше вполне себе ясно написал, где оно хранится.
Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_textОчевидно, что здесь идет речь о том, что оно не добавляется в modTemplateVarResource.
Много раз уже это обсуждалось… Дефолтное значение TV хранится в таблице modx_site_tmplvars, а сами значения в modx_tmplvar_contentvalues. Где-то у Боба Рэя инструкция валялась по работе с TV с этим учётом.
WHERE ( `TVis_present`.`value` = '1' ...
Разве не работает?
о боже, откуда вы это нашли) Попробую, правда уже несколько переписал логику работы.
Но для развития нужно опробовать. Каюсь, я писал почти так же как и вы (поняв из логов что TVis_present это что то типа псевдонима ), но я писал так — 'where' => ['TVis_present.is_present' => 1]
Но для развития нужно опробовать. Каюсь, я писал почти так же как и вы (поняв из логов что TVis_present это что то типа псевдонима ), но я писал так — 'where' => ['TVis_present.is_present' => 1]
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.