Как создать модель, принадлежащую hasMany через модель соединения?

Я буду использовать пример CourseMembership из руководства CakePHP, чтобы проиллюстрировать свой вопрос. Итак, имеются следующие таблицы:

CREATE TABLE course ( id INT NOT NULL PRIMARY KEY, course_name VARCHAR(255) ); CREATE TABLE student ( id INT NOT NULL PRIMARY KEY, student_name VARCHAR(255) ); CREATE TABLE course_membership ( course_id INT NOT NULL REFERENCES(course.id), student_id INT NOT NULL REFERENCES(student.id), attended_lectures TINYINT NOT NULL DEFAULT 0, PRIMARY KEY (course_id, student_id) );

Мои модели выглядят так:

class Course extends AppModel {
    public $hasMany = array('CourseMembership');
}
class Student extends AppModel {
    public $hasMany = array('CourseMembership');
}
class CourseMembership extends AppModel {
    public $belongsTo = array('Course', 'Student');
}

Как лучше всего добавить модель/таблицу CourseMembershipProperty в эту настройку? Мне любопытны как схема, так и конфигурация отношений в классе модели.

Отношения должны быть:

  • CourseMembershipProperty принадлежит CourseMembership
  • CourseMembership имеет много CourseMembershipProperty.

Для простоты таблица модели CourseMembershipProperty может иметь два поля VARCHAR, name и value.


person Alex    schedule 29.03.2014    source источник


Ответы (1)


Есть несколько вопросов:

Имена ваших таблиц должны быть во множественном числе:

course должно быть courses

student должно быть students

course_membership должно быть course_memberships

Обратите внимание на этот раздел кулинарной книги CakePHP:

http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions

«CakePHP не поддерживает составные первичные ключи».

Таблица course_memberships должна иметь первичный ключ id, который автоматически увеличивается, а составные первичные ключи course_id и student_id должны быть удалены и использоваться в качестве внешних ключей. Без предварительного исправления этой проблемы модель CourseMembership будет работать неправильно.

После этого модель CourseMembershipProperty должна быть связана с моделью CourseMembership с помощью внешнего ключа course_membership_id. Это должно работать, просто определяя модели, как в вашем примере, поскольку на этом этапе мы будем следовать соглашениям об именах CakePHP.

person When1ConsumeMem    schedule 30.03.2014