如何将对象列表用于关系对象的条件


How to use object listing for condition on relation object

这个问题以前可能问过,但我找不到满意的答案。让我们有一个名为 Product 的对象,它与标签有关系。因此,如果我们需要查找特定标签的产品,作为 pimcore 对象列表直接在主表/视图上工作,将关系存储为单列中的逗号分隔值。因此,其他人仅建议LIKE搜索解决方案。

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

但我认为,这个解决方案有一个更大的问题 如果某些产品存储标签 ID 如 00,111,112,189,并且我们想搜索标签 id = 11 它也将返回不需要的标签 ID 的产品,例如 111、112 记录。

一种完全忽略 pimcore 对象并使用 Zend DB 调用来object_ [PRODUCTCLASSID] 和 object_relations_[PRODUCTCLASSID] 视图的解决方案。

如果存在任何其他解决方案来仅使用 Pimcore 对象 API 解决问题。

据我所知,关系是这样保存的:,00,111,112,189,。所以开头和结尾都有逗号。

这使您能够像这样使用您的条件:

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

请注意 % 符号前后的逗号。

来源:通过 PHP API 过滤关系

根据数据量,最好使用子选择:

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

。将XXX替换为类的 ID。

我知道这很旧,但我想添加一些我只是挣扎并且找不到任何相关内容的地方。如果你有一个多重参照,你需要添加你正在关联的对象的类型。如果是对象(如我的情况),它应该看起来像

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

也许这可以节省一些时间:)