2017-05-25 8 views
2

を合わせると、親のためにすべての子を返しています指定された郵便番号と一致する場所が表示されます。私は、フィルタを1つの特定のカテゴリの下で企業を検索することになっているので、このフィルターは、私はスウィフトのレルムを使用していますし、次のように私が構造を持っている子

companies = realm.objects(Navigation.self).filter("key = 4").first!.companies.filter(predicate).sorted(byKeyPath: "key") 

ようkey = 4ビットであることをやっています。

問題は、場所が一致する会社のすべての場所を返すことです。だから私のジップが12345で、companyAが一致する場所を持っていれば、一致していなくてもcompanyAの下のすべての場所が返されます。

結果をに限定するにはどうすれば一致しますか?

答えて

3

結果をに限定するにはどうすればよいですか?の一致する場所はありますか?

今は​​を返信していますが、場所を希望するようです。 CompaniesLocationsモデルにいくつかの逆関係プロパティを追加して、あなたが探していると思ったことを達成しました。次にLocationsのレルムを照会してzip == '12345' && ANY parentCompanies.parentNavigation.key == 4と照合しました。

import UIKit 
import RealmSwift 

class Navigation: Object { 

    dynamic var key = 0 
    dynamic var title: String? 
    let companies = List<Companies>() 

    override static func primaryKey() -> String? { 
     return "key" 
    } 
} 

class Companies: Object { 

    dynamic var key = 0 
    dynamic var name: String? 
    let locations = List<Locations>() 
    let parentNavigation = LinkingObjects(fromType: Navigation.self, property: "companies") 

    override static func primaryKey() -> String? { 
     return "key" 
    } 
} 

class Locations: Object { 

    dynamic var key = 0 
    // ... 
    dynamic var zip: String? 
    let contacts = List<Contacts>() 
    let parentCompanies = LinkingObjects(fromType: Companies.self, property: "locations") 

    override static func primaryKey() -> String? { 
     return "key" 
    } 
} 

class Contacts: Object { 

    dynamic var key = 0 
    dynamic var firstName: String? 
    dynamic var lastName: String? 
    // ... 

    override static func primaryKey() -> String? { 
     return "key" 
    } 
} 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     _ = try? FileManager.default.removeItem(at: Realm.Configuration.defaultConfiguration.fileURL!) 
     let realm = try! Realm() 

     // Objects Matching Query 
     try! realm.write { 
      // Locations 
      let locations = Locations() 
      locations.zip = "12345" 

      // Companies 
      let companies = Companies() 
      companies.name = "Companies A" 
      companies.locations.append(locations) 

      // Nav 
      let nav = Navigation() 
      nav.key = 4 
      nav.companies.append(companies) 

      // Add to Realm 
      realm.add(nav) 
     } 

     let locationsIn12345AndNavigationKey4 = realm.objects(Locations.self) 
      .filter("zip == '12345' && ANY parentCompanies.parentNavigation.key == 4") 
     print(locationsIn12345AndNavigationKey4) 

     return true 
    } 
} 

この版画:ここ

は、この実証サンプルアプリです

Results<Locations> (
    [0] Locations { 
    key = 0; 
    zip = 12345; 
    contacts = RLMArray <0x6000000f2100> (

    ); 
    } 
) 
+0

私はこれで仕事ができる、理想的に私はそれはまた、企業がしたい「自分」というユーザーは自分がどの会社を見ているかを知ることができます。同様に「Main Office」のように多くの場所があります。 –

+0

簡単に: 'locationsIn12345AndNavigationKey4.flatMap {$ 0.parentCompanies}' – jpsim

+0

このコードをもっとフレンドリーにできますか?これはフィルタに入る文字列であるはずですか?これらの実際の関数呼び出しは何ですか?私はこれも逆の関係で行う必要があると思いますか? –

関連する問題