CakePHP: где разместить эту функцию - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть 3 модели: Student, Course и StudentCourse. Курс 'hasAndBelongsToMany' Студент, Студент 'hasMany' Курс, и StudentCourse 'принадлежит' Студенту и Курсу. Прежде чем студент сможет записаться на курс, мне нужно проверить несколько вещей (т. Е. Заполнен ли курс, прошел ли этот курс в прошлом и т. Д.). Я могу справиться с логикой внутри функции, но в какую модель мне поместить эту функцию? И как это назвать? Один из способов, о котором я думал, был:

// Student Model
public function canSignupForCourse($studentId, $courseId) {
    // is the course full?
    // have they signed up before, etc
    // return either true or false
}

// Could it then be called anywhere as:
if($this->Student->canSignupForCourse($studentId, $courseId)) {
    // etc
}

Или, есть ли лучший / более простой способ сделать это (и нужно ли мне каждый раз посылать как студента, так и Courseid)?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Я думаю, что лучше всего попытаться реализовать эти ограничения в качестве правила проверки в модели.

Согласно вашему описанию, подача заявки на студента для курса осуществляется путем создания нового StudentCourseвот где вы должны попытаться соответствовать правилам валидации, например:

// StudentCourse.php

$validate = array(
    'course_id' => array(
         'rule' => array('maxStudents', 30),
         'required' => true,
         'on' => 'create'
    )
)

function maxStudents($check, $max) {
    $count = $this->find('count', array(
        'conditions' => array('course_id' => $check['course_id']),
        'contain' => false
    ));
    return $count < $max;
}
0 голосов
/ 23 февраля 2012

Я бы сначала проверил пример в руководстве здесь: 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 вернет описательное сообщение об ошибке, если оно окажется неудачным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...