2

、、の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:

申し訳ありませんが、私は関係について何かを明確にするのを忘れました。エンティティobjectとは、オブジェクトとタグのペアを含むtag中間エンティティを指します。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_tag *object_tagsへの対多の関係であり、は*object_tag*からタグへの対1の関係です。tag

オブジェクトモデルをとの間の多対多の関係に単純化するobjecttag(コメントで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 に答える