Предположим, я хочу построить модели данных Student
и Course
и хочу, чтобы каждый студент был зарегистрирован на нескольких курсах и каждый курс содержал несколько студентов. Что я должен делать?
Вот что у меня есть на данный момент:
@Model
class Student {
var name: String
@Relationship(deleteRule: .cascade, inverse: \Course.students) var courses: [Course]
init(name: String, courses: [Course]) {
self.name = name
self.courses = courses
}
}
@Model
class Course {
var name: String
@Relationship(deleteRule: .cascade, inverse: \Student.courses) var students: [Student]
init(name: String, students: [Student]) {
self.name = name
self.students = students
}
}
И это показывает ошибку: Circular reference resolving attached macro 'Relationship'
.
Правильный «реляционный» способ сделать это — создать третий класс Enrolment
, у которого в качестве свойств есть студент и курс, а также связь один-ко-многим с каждым из tStudent
и Course
.
SwiftData не является реляционной базой данных. Создание модели Enrollment
противоречит фреймворку и сделает представления SwiftUI излишне усложненными.
С помощью deleteRule
, который вы написали, вы говорите, что при удалении курса вы хотите, чтобы все его студенты были удалены. А затем, когда эти студенты удаляются, каждый из их курсов удаляется. Неудивительно, что компилятор жалуется!
Вы почти наверняка хотите здесь .nullify
, а не .cascade
. Совершенно разумно иметь Курсы, на которые еще никто не записался, и Студентов, которые еще не зарегистрировались на занятия.
Не указывайте оба отношения. Указывая инверсию первого, вы неявно определяете второй.
Вам нужен только один
@Relationship
. Удалите тот, что вCourse
. См. также: hackingwithswift.com/quick-start/swiftdata/…