2013-10-07 94 views
1

我有用戶,我有課程。我正在嘗試爲用戶創建一個「加入」按鈕,以便他們查看課程列表以訂閱課程。在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關係,它假定有一個courses_users表在你的數據庫並在保存相關的用戶會寫信給它自動地當然,即使被調用的函數是$ this-> Course-> saveAll()(它保存了相關的數據)。 – Chris

+0

@Chris這實際上是完美的 - 除了當另一個用戶註冊同一個課程時,它使用新的用戶名寫入文件,儘管這兩個對象都有一個$ hasAndBelongsToMany。你知道爲什麼會發生這種情況嗎? – itamar

+0

保存HABTM數據的CakePHP的默認行爲是刪除關聯到一個保存,然後從數據創建的那些(作爲唯一的選項中的鏈接解釋如下)中的所有記錄:HTTP://book.cakephp。 org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm,解決方案是使用'unique'=> keepExisting聲明您的habtm關係。 – Chris

3

如果您是新的我會建議使用蛋糕烘焙工具,它會檢查你的表,詢問有關關係中的一些問題,並建立所有基本的創建,更新和刪除操作的模型,控制器和視圖在數據庫。然後您可以根據需要修改它們。這就是我仍然這樣做以節省大量時間。

+0

AbraCadaver是正確的,你將受益於自動烘烤模式/控制器/視圖,以簡化您的基本任務,並學習如何簡單的事情完成。如果你想要一個用戶界面而不是控制檯來烘焙文件,請使用以下工具:http://patisserie.keensoftware.com/en/cakes – Chris

+0

感謝您的提示,每個人。我一定會檢查出來。 – itamar