gpt4 book ai didi

objective-c - 核心数据 - 使用数组的确切元素获取对象过滤数据

转载 作者:行者123 更新时间:2023-12-04 05:07:59 25 4
gpt4 key购买 nike

我有 3 个实体:object , object_tagtag ,并且我必须仅通过其 id 获取与标签数组匹配的对象,而不仅仅是标签,而是与数组中的所有标签完全匹配。如果数组有 3 个标签,则返回所有具有这 3 个标签且不多不少的对象。

实体是这样的:

object
{
id
name
-----
tags <--->> object_tags
}

object_tag
{
id
id_object
id_tag
-----
object <---> tags
tag <---> objects
}

tag
{
id
name
-----
objects <--->> object_tags
}

使用谓词和/或表达式我怎样才能得到我想要的?。我尝试了很多方法,但我得到的只是包含数组中任何标签的对象,但不是一次包含所有标签。

编辑 1:

对不起,我忘了澄清一些关于关系的事情。实体 objecttag指向中间实体 object_tag , 包含对象-标签对。

最佳答案

对象实体的以下谓词应该有效:

NSArray *tagIds = @[ @1, @4, @7 ]; // Your set of tag ids
[NSPredicate predicateWithFormat:@"(object_tags.@count == %d) AND (SUBQUERY(object_tags, $x, $x.tag.id IN %@).@count == %d)",
tagIds.count, tagIds, tagIds.count];

哪里 object_tags是从对象到 *object_tag* 的多对多关系,而 tag是从 *object_tag* 到标签的一对一关系。

如果您将对象模型简化为 object 之间的多对多关系和 tag (正如 David Ravetti 在评论中所建议的那样),那么谓词将如下所示:
[NSPredicate predicateWithFormat:@"(tags.@count == %d) AND (SUBQUERY(tags, $x, $x.id IN %@).@count == %d)",
tagIds.count, tagIds, tagIds.count];

如果您只想检查对象是否具有给定数组中的所有标签(但可能有更多标签),那么您可以将查询简化为
[NSPredicate predicateWithFormat:@"SUBQUERY(tags, $x, $x.id IN %@).@count == %d",
tagIds, tagIds.count];

关于objective-c - 核心数据 - 使用数组的确切元素获取对象过滤数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15270124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com