2017-08-17 91 views
0

使用领域我设置了2个对象:UserQuestion在数据透视表关系上过滤领域

每个用户答案的​​问题,这是存储在第三对象,像这样:

class Answer : Object { 
    dynamic var user: User? 
    dynamic var question: Question? 
    dynamic var answerText = "" 
} 

我需要做什么,被赋予了用户对象和问题对象,获得相关答案对象。在半SQL伪代码是这样的:

SELECT FROM Answers WHERE user = User and question = Question 

 

所以...我如何实现这一目标?

 


 

红利点,如果不存在具有抓取问题对象,而是使用该对象的主键(我的用户对象的一种方式,但只有问题ID,所以我必须先解决问题对象),所以像这样:

SELECT FROM Answers WHERE user = User and question.id = Question.id 

也因为领域不会将整个对象加载到内存中,直到您需要它为止,我不认为这是有能力的。

注意:我已简化了一些问题。有一个很好的理由,我没有主要答案ID,所以请不要告诉我添加一个。

回答

3

您需要更改User模型以包含与Answer的反比关系。这将自动包含user等于当前用户的所有答案。

然后,您需要查询用户,访问他们的answers属性并根据问题进行过滤。

我已经创建了这些框架类,以便我可以测试查询,我知道您的UserQuestion类可能会有所不同,因此请更改primaryKey和问题过滤器以适合您的确切类定义。

class User: Object { 
    let answers = LinkingObjects(fromType: Answer.self, property: "user") 
    dynamic var userName = "" 
    override class func primaryKey()->String { 
     return "userName" 
    } 
} 

class Answer : Object { 
    dynamic var user: User? 
    dynamic var question: Question? 
    dynamic var answerText = "" 
} 

class Question: Object { 
    dynamic var title = "" 
} 

let questionId = "" 
let questions = realm.object(ofType: User.self, forPrimaryKey: "userName")?.answers.filter("question.id = %@",questionId) 
+1

感谢Dávid,我不知道我可以过滤相关属性,比如'user.id'这么容易!,你的回答让我创建一个测试应用程序,我发现我可以做'realm.objects (Answer.self).filter(“user.id =%@ AND question.id =%@”,1,7)'。谢谢你的帮助 – TRG