Этот вопрос может быть задан ранее, но я не могу найти удовлетворительный ответ. Пусть у нас есть объект с именем Product, имеющий отношение к тегам. Поэтому, если нам нужно найти продукты для конкретного тега, список объектов Pimcore работает непосредственно на главной таблице / представлении, в которых отношения хранятся в виде значений, разделенных запятыми, в одном столбце. Таким образом, только LIKE поисковое решение предлагается другими.
$entries ->setCondition("Tags LIKE " . $entries->quote("%".$tagId."%"));
Но я думаю, у этого решения есть одна большая проблема. Если некоторые продукты хранят теги с идентификатором, например, 00,111,112,189, и мы хотим выполнить поиск по тегу id = 11, он также вернет продукты с нежелательными идентификаторами тегов, такими как 111, 112 запись.
Одно из решений — вообще игнорировать объект pimcore и использовать вызовы Zend DB для представлений object_ [PRODUCTCLASSID] и object_relations_ [PRODUCTCLASSID].
Если существует какое-либо другое решение для решения проблемы, используя только Pimcore Object API.
Насколько я знаю, отношения сохраняются так: ,00111112189,. Так что с запятой в начале и в конце.
Это позволяет вам использовать ваше условие следующим образом:
$entries ->setCondition("Tags LIKE " . $entries->quote("%,".$tagId.",%"));
Обратите внимание на запятую после и до % знак.
В зависимости от объема данных лучше использовать дополнительный выбор:
$entries ->setCondition("o_id IN (SELECT src_id FROM object_relation_XXX where dest_id = $tagId AND fieldname = 'Tags')");
… замещать XXX
с идентификатором класса.
Я знаю, что это старо, но я хотел добавить кое-что, где я только боролся и не мог действительно найти что-нибудь связанное.
Если у вас есть Multihref, вам нужно добавить тип объекта, к которому вы относитесь. В случае объекта (как в моем случае) он должен выглядеть примерно так
"%,object|".$relationId.",%"
Может быть, это сэкономит кому-то время 🙂