Я бы сначала проверил пример в руководстве здесь: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through-the-join-model
Это должно убедить вас, что вы, вероятно, должны также пройти курс Student 'hasAndBelongsToMany' (поскольку курс has
студент, но студент не belongto
курс в ваших модельных отношениях)
Затем вы можете определить эту модель отношений как нечто вроде CourseMembership (как в приведенном выше примере ссылки)
Я бы тогда добавил функцию canSignupForCourse в эту модель. Однако я бы, вероятно, разделил эту функцию на несколько отдельных, таких как courseNotFull и courseNotTakenBefore
Затем я бы поместил эти функции в объект проверки модели следующим образом:
public $validate = array(
'course_id' => array(
'courseNotFull' => array(
'rule' => array('courseNotFull'),
'message' => "Course is full",
),
'courseNotTakenBefore' => array(
'rule' => array('courseNotTakenBefore'),
'message' => "Student has taken course before",
)
)
);
И определить функции модели следующим образом:
function courseNotFull() {
$this->Course->id = $this->data[$this->alias]['course_id'];
$course = $this->Course->read();
return $course['Course']['isFull'];
}
function courseTakenBefore() {
$this->Student->id = $this->data[$this->alias]['student_id'];
$this->Course->id = $this->data[$this->alias]['course_id'];
$course = $this->Student->Course->findById($this->Course->id);
return $course;
}
Теперь всякий раз, когда вы пытаетесь сохранить или проверить () CourseMembership, validate вернет описательное сообщение об ошибке, если оно окажется неудачным.