2012-02-22 3 views
0

나는 Student, Course 및 StudentCourse의 3 가지 모델을 가지고 있습니다. 'hasAndBelongsToMany'코스, hasMany '코스, StudentCourse'belongsTo '학생 및 코스. 학생이 코스에 등록하기 전에 몇 가지 사항을 확인해야합니다 (예 : 코스가 가득차 있거나 과거에 코스를 수강했는지 등). 함수 내에서 로직을 처리 할 수는 있지만 어떤 모델에서 그 함수를 배치해야합니까? 그리고 어떻게 호출해야합니까?CakePHP :이 기능을 배치 할 곳

// 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 
} 

또는 그것을 할 수있는 더 나은/쉬운 방법이있다 (그리고, 나는 studentid 모두를 보내고마다 courseid해야합니까) : 내가 생각하는 한 가지 방법이었다?

답변

2

내가 할 수있는 가장 좋은 방법은 모델의 유효성 검사 규칙으로 이러한 제한 사항을 구현하려고하는 것입니다. 과정에 대한 학생을 적용하여 설명에 따르면

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

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through-the-join-model

이것은 당신이 아마뿐만 아니라 (이후 과정 has 학생하지만 학생 나던 모델 관계에서 belongto 과정) 학생 'hasAndBelongsToMany의'과정을 확인해야합니다 당신을 설득해야

: 여기 설명서의 예를 알아

당신은 (위의 예 링크에서와 같이) 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 유효성을 검사 할 때마다 유효성 검사는 설명이 포함 된 오류 메시지를 반환합니다.

+0

이것을 사용하여 새로운 CourseMembership을 만드는 방법 (어떻게 course_id 및 student_id를 설정할 수 있습니까?) – execv

+0

다른 모델과 동일합니다. 학생이 로그인하여 강좌에 등록하려고 시도합니다. 그의 학생 ID는 http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#accessing-the-logged-in-user와 같은 것으로 액세스 할 수 있습니다. course_id는 게시물 데이터와 함께 제출되어야합니다. 그런 다음 컨트롤러에서 student_id를 $ this-> request-> data에 추가하고 $ this-> CourseMembership-> create();를 호출하면됩니다. $ this-> CourseMembership-> save ($ this-> request-> data); 멋진 점은 출석 및 성적과 같은 특정 회원 정보에 추가 정보를 추가 할 수 있다는 것입니다. – Vigrond

관련 문제