2

我有 3 个实体:objectobject_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包含对象标签对的中间实体。

4

1 回答 1

3

对象实体的以下谓词应该起作用:

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到 *object_tag*object_tags的一对多关系,是从 *object_tag* 到tag的一对一关系。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];
于 2013-03-07T18:32:03.437 回答