2013-10-07 3 views
1

나는 사용자가 있으며 코스가 있습니다. 나는 그들이 코스에 그들을 구독하기 위해 코스리스트를 볼 때 사용자를위한 "Join"버튼을 만들려고합니다.CakePHP 관련 객체

나는

class Course extends AppModel 
{ 
    public $hasAndBelongsToMany = array('User'); 
} 

class User extends AppModel 
{ 
    public $hasAndBelongsToMany = array('Course'); 
} 

를 사용 들었다하지만 실제 버튼과 테이블에 정보의 게시를 구현하는 방법을 모르는 courses_users

라고

어디서 구현합니까? 사전에

감사합니다!

답변

1

학생 ID와 코스 ID를 saveAll() 방법으로 보내고 싶습니다. 다음과 같이 당신은 당신의 과정 컨트롤러를 통해이 작업을 수행 할 수 있습니다 :

<?php 
class CoursesController extends AppController { 

    public function join($courseId) { 
     $data = array(
      'Course' => array(
       'id' => $courseId 
      ), 
      'Student' => array(
       'id' => $this->Auth->user('id') // ID of logged in user 
      ) 
     ); 

     if ($this->Course->saveAll($data)) { 
      $this->Session->setFlash(__('Successfully joined course.')); 
     } 
     else { 
      $this->Session->setFlash(__('Error joining course.')); 
     } 

     $this->redirect('/'); 
    } 
} 

이것은 단순한 예입니다. 앱에 맞게 조정할 필요가 있습니다.

+1

CakePHP는 컨벤션 오버 규칙의 원칙을 기반으로합니다. 코스 모델과 사용자 모델간에 HABTM 관계가있는 경우 DB에 courses_users 테이블이 있다고 가정하고, 사용자와 관련된 사용자를 저장할 때 자동으로 작성합니다 물론, 호출 된 함수가 $ this-> Course-> saveAll() (관련 데이터 저장) 인 경우에도 마찬가지입니다. – Chris

+0

@Chris 이것은 실제로 완벽합니다. 다른 사용자가 같은 코스에 등록 할 때 $ hasAndBelongsToMany가 두 객체에 모두 첨부되어 있어도 새 사용자 이름으로 파일을 덮어 씁니다. 왜 이런 일이 일어날 지 아십니까? – itamar

+0

CakePHP에서 HABTM 데이터를 저장하는 기본 동작은 저장 한 레코드와 관련된 모든 레코드를 삭제 한 다음 데이터에서 레코드를 생성하는 것입니다 (고유 옵션에 대해서는 아래 링크에서 설명) : http : //book.cakephp. org/2.0/ko/models/associations-linking-models-together.html #standany-habtm이있는 경우, 해결책은 '고유'=> keepExisting을 사용하여 habtm 관계를 선언하는 것입니다. – Chris

3

이 새로운 경우 테이블을 검사 할 케이크 굽기 유틸리티를 사용하고 관계에 대한 몇 가지 질문을하고 데이터베이스의 모든 기본 작성, 업데이트 및 삭제 작업에 대한 모델, 컨트롤러 및보기를 작성하는 것이 좋습니다. . 그런 다음 필요에 맞게 수정할 수 있습니다. 그것이 내가 많은 시간을 절약하기 위해 아직도하는 방법입니다.

+0

AbraCadaver가 맞으면 자동으로 구운 모델/컨트롤러/뷰의 기본 작업을 단순화하고 간단한 작업 수행 방법을 익히는 것이 좋습니다. 콘솔이 아닌 UI로 파일을 굽고 싶다면 다음 도구를 사용하십시오. http://patisserie.keensoftware.com/en/cakes – Chris

+0

팁을 주셔서 감사합니다. 나는 그것을 확실히 체크 아웃 할 것이다. – itamar