-->

2020年5月2日土曜日

モデルが持つ配列内を検索し、条件に該当するモデルを取得する

モデルが持つ配列内を検索し、条件に該当するモデルを取得する
モデルデータ
//レシピモデル
class Recipe: Object {
    @objc dynamic var name =  ""
    @objc dynamic var category = ""
    @objc dynamic var country = ""
    @objc dynamic var season = ""
    let ingredients = List() //レシピと材料は1対多の関係
    override static func primaryKey() -> String? {
        return "name"
    }
}

//材料モデル
class Ingredient: Object {
    @objc dynamic var name = ""
    let recipes = LinkingObjects(fromType: Recipe.self, property: "ingredients")
    
}

モデルデータの格納、検索、表示
do {
            //トマトパスタ、カツ丼、カレーの3つのレシピのモデルを作成
            let realm = try Realm()
            let dictionary1: [String: Any] =
                ["name": "トマトパスタ",
                 "category": "パスタ",
                 "country" : "イタリア",
                 "season" : "春",
                 "ingredients":[["name": "トマト"],["name": "にんにく"]]
                ]

            let dictionary2: [String: Any] =
                ["name": "カツ丼",
                  "category": "丼",
                  "country" : "日本",
                  "season" : "夏",
                  "ingredients":[["name": "たまねぎ"],["name": "卵"]]
                 ]
            let dictionary3: [String: Any] =
                ["name": "カレー",
                  "category": "カレー",
                  "country" : "日本",
                  "season" : "夏",
                  "ingredients":[["name": "たまねぎ"],["name": "にんじん"],["name":"じゃがいも"]]
                 ]
            let recipe1 = Recipe(value: dictionary1)
            let recipe2 = Recipe(value: dictionary2)
            let recipe3 = Recipe(value: dictionary3)
            
            try! realm.write {
                realm.deleteAll() //既に保存済のモデルを一旦削除
                realm.add(recipe1)//レシピモデルの保存
                realm.add(recipe2)//レシピモデルの保存
                realm.add(recipe3)//レシピモデルの保存

                //材料にたまねぎを使用するレシピモデルを取得する
                var objects: Results<Recipe>
                objects = realm.objects(Recipe.self).filter("SUBQUERY(ingredients, $ingredient, $ingredient.name = %@).@count >= 1","たまねぎ")
                print("objectsの中",objects)
            }
            
        } catch {
            print("エラー")
        }

出力結果
objectsの中 Results <0x10461f0e0> (
 [0] Recipe {
  name = カツ丼;
  category = 丼;
  country = 日本;
  season = 夏;
  ingredients = List <0x280756760> (
   [0] Ingredient {
    name = たまねぎ;
   },
   [1] Ingredient {
    name = 卵;
   }
  );
 },
 [1] Recipe {
  name = カレー;
  category = カレー;
  country = 日本;
  season = 夏;
  ingredients = List <0x280756880> (
   [0] Ingredient {
    name = たまねぎ;
   },
   [1] Ingredient {
    name = にんじん;
   },
   [2] Ingredient {
    name = じゃがいも;
   }
  );
 }
)

0 件のコメント:

コメントを投稿