Как использовать листинг объекта для условия на объекте отношения

Этот вопрос может быть задан ранее, но я не могу найти удовлетворительный ответ. Пусть у нас есть объект с именем 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.

2

Решение

Насколько я знаю, отношения сохраняются так: ,00111112189,. Так что с запятой в начале и в конце.

Это позволяет вам использовать ваше условие следующим образом:

$entries ->setCondition("Tags LIKE " . $entries->quote("%,".$tagId.",%"));

Обратите внимание на запятую после и до % знак.

3

Другие решения

В зависимости от объема данных лучше использовать дополнительный выбор:

$entries ->setCondition("o_id IN (SELECT src_id FROM object_relation_XXX where dest_id = $tagId AND fieldname = 'Tags')");

… замещать XXX с идентификатором класса.

2

Я знаю, что это старо, но я хотел добавить кое-что, где я только боролся и не мог действительно найти что-нибудь связанное.
Если у вас есть Multihref, вам нужно добавить тип объекта, к которому вы относитесь. В случае объекта (как в моем случае) он должен выглядеть примерно так

"%,object|".$relationId.",%"

Может быть, это сэкономит кому-то время 🙂

0
По вопросам рекламы [email protected]