2012-02-22 13 views
0

私は3つのモデルを持っています:Student、Course、およびStudentCourse。コース '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学生が、学生doesntのモデルとの関係でbelongtoコース)スチューデントhasAndBelongsToManyの "コースを作る必要があることを納得させる必要があり

:ここでは、マニュアルの例アウト

あなたは、私は、そのモデルにcanSignupForCourse機能を置く(上の例のリンクのように)CourseMembership

のようなものとして、その関係のモデルを定義することができます。

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", 
     ) 
    ) 
); 

などのモデル関数を定義する:しかし、私はおそらく、私はそのようにように、モデルの検証オブジェクトにこれらの関数をかけることになりcourseNotFullとcourseNotTakenBeforeなどの

、いくつかの独立したものに、この機能を分割したいですこの:それが失敗した場合

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

関連する問題