php - Creating a User who has-and-belongs-to-many existing Courses with a CakePHP form -


i have app 2 associated models: user , course, related habtm association.

there registration form new user may enter username , select courses part of (from list of existing courses in database), form saves new users - doesn't save join table.

the join table (courses_users) has columns course_id , user_id, , 2 models this:

// user.php class user extends appmodel {     public $name = 'user';      public $hasandbelongstomany = array(         'courses' => array(             'classname' => 'course',             'jointable' => 'courses_users',             'foreignkey' => 'user_id',             'associatedforeignkey' => 'course_id'         )     ); }  // course.php class course extends appmodel {     public $name = 'course';      public $hasandbelongstomany = array(         'users' => array(             'classname' => 'user',             'jointable' => 'courses_users',             'foreignkey' => 'course_id',             'associatedforeignkey' => 'user_id'         )     ); } 

in addition, controller action:

// identificationcontroller.php public function register() {     if ($this->request->is('post')) {         $data = $this->request->data;         $username = $data['user']['username'];          $saved = $this->user->save($data, array('deep' => true));         //debug($data);          if ($saved) {             $this->_set_new_user_session($username);              //$log = $this->user->getdatasource()->getlog(false, false);             //debug($log);              $this->redirect(array('controller' => 'users', 'action' => 'index'));         }     }      // not redirecting     $courses = $this->course->find('list', array('course.name'));     //debug($courses);     $this->set(compact('courses')); } 

and form, sans container divs:

<?php echo $this->form->create('user', array(     'inputdefaults' => array(         'label' => false,         'div' => false     ),     'url' => '/identification/register' ));  echo $this->form->input('username', array(     'error' => false,     'autofocus' => true,     'required' => true,     'pattern' => '[a-za-z0-9]{3,16}' ));  if ($this->form->isfielderror('username')) {     echo $this->form->error('username', null, array('wrap' => 'small', 'class' => 'error')); }  echo $this->form->input('course.course', array(     'error' => false,     'required' => true ));  if ($this->form->isfielderror('courses')) {     echo $this->form->error('course', null, array('wrap' => 'small', 'class' => 'error')); }  echo $this->form->button('register', array(     'div' => false,     'type' => 'submit' ));  echo $this->form->end(); ?> 

when call debug($data), right data seems passed form controller:

array(     'user' => array(         'username' => 'test63apd'     ),     'course' => array(         'course' => array(             (int) 0 => '1'         )     ) ) 

but nothing happens join table, , there no mention of join table in datasource log:

array(     'log' => array(         (int) 0 => array(             'query' => 'begin',             'params' => array(),             'affected' => null,             'numrows' => null,             'took' => null         ),         (int) 1 => array(             'query' => 'insert `xray2`.`users` (`username`) values ('test06apd')',             'params' => array(),             'affected' => (int) 1,             'numrows' => (int) 1,             'took' => (float) 1         ),         (int) 2 => array(             'query' => 'commit',             'params' => array(),             'affected' => (int) 1,             'numrows' => (int) 1,             'took' => (float) 1         )     ),     'count' => (int) 3,     'time' => (float) 2 ) 

am missing obvious here, or there quirk of cake have yet discover?

you're telling cake save primary model data. need change line:-

$saved = $this->user->save($data, array('deep' => true)); 

to:-

$saved = $this->user->saveassociated($data, array('deep' => true)); 

saveassociated() tells cake save current model , associated data. shouldn't need pass array('deep' => true) saving data directly associated model. better (and safer) use:-

$saved = $this->user->saveassociated($data); 

update

there issue data being saved not using alias defined in association data. when cake attempts save associated data can't see any. according code user model has , belongs many courses (plural) save data uses course (singular). therefore, form should be:-

echo $this->form->input('courses.courses', array(     'error' => false,     'required' => true )); 

it should noted cake naming conventions use singular forms model names, better use course in association rather courses. if change association can simplified following:-

public $hasandbelongstomany = array(     'course' ); 

cake understand how handle join table , foreign keys conform naming convention. wouldn't need change form.


Comments

Popular posts from this blog

android - Gradle sync Error:Configuration with name 'default' not found -

java - Andrioid studio start fail: Fatal error initializing 'null' -

html - jQuery UI Sortable - Remove placeholder after item is dropped -