【问题标题】:Understanding and using Parse many to many relations理解和使用解析多对多关系
【发布时间】:2014-06-09 09:15:00
【问题描述】:

我在 Parse 中有 2 个表格,如下所示:

Users:
(PFUsers table with all Parse data)
belongsToGroups (A Parse Relation to Groups which is many to many)

Groups:
groupId
name
groupMembers (A Parse Relation to Users which is also many to many)

我有以下代码:

PFObject *groups = [PFObject objectWithClassName:@"Groups"];
groups[@"name"] = name;
syncUsers[@"isActive"] = [NSNumber numberWithInt:1];
//[groups saveInBackground];

PFUser *current = [PFUser currentUser];
PFRelation *relation = [syncUsers relationforKey:@"groupMembers"];
[relation addObject:current];
[groups saveEventually];

PFRelation *relation2 = [current relationforKey:@"belongsToGroups"];
[relation2 addObject:groups];
[current saveEventually];

首先,前 2 个代码块工作正常,但如何更新用户中的关系,以便我可以在 Parse 中查看关系并查看我的组?

二,我是否需要在用户和组中创建关系,以便它可以多对多?

【问题讨论】:

  • 如果要双向查询,需要在Group中添加反向关系。看起来“Groups”实际上是一个“Group”,所以你应该使用这个词的单数版本;不是复数。另外,由于 isActive 听起来像一个布尔值,你应该使用 [NSNumber numberWithBool:YES] 而不是 numberWithInt。最后一个块没有在您的 User 类中创建关系吗?
  • 最后一个块没有创建关系。我希望有,但为什么没有呢?
  • 您是否在数据浏览器中的 User 类上创建了“关系”?
  • 是的。我想 PFUser 类可能有问题?因为它不是常规的 PFObject?

标签: ios parse-platform pfrelation


【解决方案1】:

您可以在关系column 上使用whereKey:equalTo: 并将PFObject 传递给它。然后,此查询将返回在其“学生”关系中包含该学生的所有教师对象:

PFQuery *query = [PFQuery queryWithClassName:@"Teacher"];
[query whereKey:@"students" equalTo:student];

在此示例中,学生是 PFObject,其 className 与“学生”中的关系匹配。如果这是PFUsers 中的relation,并且您正在寻找当前用户的“老师”,您可以使用:

PFQuery *query = [PFQuery queryWithClassName:@"Teacher"];
[query whereKey:@"students" equalTo:[PFUser currentUser]];

【讨论】:

  • 那么获取一个学生的所有教师和一个教师的所有学生的代码是什么?我看到第一个,但第二个在哪里
【解决方案2】:

首先,对于一个关系,您需要两个对象都存在于 Parse 数据库中。然后,您必须使用 PFRelation 对象并将对象与关系一起保存。

我建议使用 CodeCloud 来建立关系,以便您可以与 Android 或 Web 应用程序共享代码。

// Objects
PFObject *student = [PFObject objectWithoutDataWithClassName:@"Student" objectId:@"xauj37H"];

PFObject *teacher = [PFObject objectWithoutDataWithClassName:@"Teacher" objectId:@"xJdcj238"];

// Add a student to the teacher object

// Get the students relation
PFRelation *studentsForTeacher = [teacher relationForKey:@"students"];

// Add a student
[studentsForTeacher addObject:student];

// save the teacher, use InBackground instead 
[teacher save];

// Now add a teacher for the student
PFRelation *teachersForStudent = [student relationForKey:@"teachers"];

[teachersForStudent addObject:teacher];

// Save the student
[student save];

// And now you can query the students of a teacher or the teachers of a student

// Students for a Teacher
PFQuery *studentsQuery = [studentsForTeacher query];

[studentsQuery find];

// Teachers for a Student
PFQuery *teachersQuery = [teachersForStudent query];

[teachersQuery find];

【讨论】:

  • 所以我上面的想法是正确的。为 PFUser 类保存一定很奇怪
  • 如果您正在编辑 PFUser,您应该在 CodeCloud 中使用 Parse.Cloud.useMasterKey() 以绕过 ACL
猜你喜欢
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多