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

Posted

技术标签:

【中文标题】如何将对象列表用于关系对象的条件【英文标题】:How to use object listing for condition on relation object 【发布时间】:2016-04-20 17:11:50 【问题描述】:

这个问题可能以前被问过,但我找不到令人满意的答案。让我们有一个名为 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] AND object_relations_[PRODUCTCLASSID] 视图的解决方案。

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

【问题讨论】:

【参考方案1】:

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

这使您可以像这样使用您的条件:

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

注意 % 符号前后的逗号。

来源:Filtering for relations via php API

【讨论】:

我想你误会了,我只需要过滤掉tagid = 11,我不需要111、112等等。 按预期使用上述程序对我有用。我有两个对象,第一个具有这些关系 ,00,11,111,112,189,第二个具有这些关系 ,00,111,112,189, 。当使用 WHERE 标签 LIKE '%,11,%';我只得到了预期的第一个对象。 % 符号前后的逗号非常重要。【参考方案2】:

我知道这是旧的,但我想添加一些我只是挣扎并且无法真正找到任何相关内容的东西。 如果您有 Multihref,则需要添加您所关联的对象类型。如果是对象(如我的情况),它应该看起来像

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

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

【讨论】:

【参考方案3】:

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

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

...用类的ID替换XXX

【讨论】:

以上是关于如何将对象列表用于关系对象的条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中一次将多个对象添加到 ManyToMany 关系?

休眠条件排序依据

C ++从两个类中确定void *的类型

过滤具有多对多关系的对象,检查它是不是包含列表中的至少一个元素

如何将 sortDescriptor 用于一对多关系的属性

在核心数据中搜索所有具有空“对多”关系的对象