Does CakePHP treat all INT fields as ID's for join tables?
        Posted  
        
            by Jonnie
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Jonnie
        
        
        
        Published on 2010-06-08T11:52:42Z
        Indexed on 
            2010/06/09
            8:02 UTC
        
        
        Read the original article
        Hit count: 294
        
I am trying to save a User, their Profile, and some tags and my join table that links the profile and the tags keeps getting messed up.
The profile model is called Instructor, the tag model is called Subject. The Instructor has a phone number and a zip code and for some reason CakePHP thinks these are the fields it should use when creating entries in my join table.
My Join table always comes out as:
id | instructor_id | subject_id | 1 | 90210 | 1 | // thinks that the zip code is an instructor_id 2 | 1112223333 | 1 | // thinks that the phone number is an instructor_id 3 | 1 | 1 | // thinks that user_id is an instructor_id 4 | 1 | 1 | // the actual instructor_id, this one's correct 5 | 90210 | 2 | 6 | 1112223333 | 2 | 3 | 1 | 2 | 4 | 1 | 2 |
My Models:
class Instructor extends AppModel
{
    var $name = 'Instructor';
    var $belongsTo = array('User', 'State');
    var $hasAndBelongsToMany = array(
        'Subject' => array(
            'className'                 => 'Subject',
            'joinTable'                 => 'instructors_subjects',
            'foreignKey'                => 'instructor_id',
            'associationForeignKey'     => 'subject_id',
            'unique'                    => true,
            'conditions'                => '',
            'fields'                    => '',
            'order'                     => '',
            'limit'                     => '',
            'offset'                    => '',
            'finderQuery'               => '',
            'deleteQuery'               => '',
            'insertQuery'               => ''
        )   
    );
}
class Subject extends AppModel
{
    var $name = 'Subject';
    var $hasAndBelongsToMany = array(
        'Instructor' => array(
            'className'                 => 'Instructor',
            'joinTable'                 => 'instructors_subjects',
            'foreignKey'                => 'subject_id',
            'associationForeignKey'     => 'instructor_id',
            'unique'                    => true,
            'conditions'                => '',
            'fields'                    => '',
            'order'                     => '',
            'limit'                     => '',
            'offset'                    => '',
            'finderQuery'               => '',
            'deleteQuery'               => '',
            'insertQuery'               => ''
        )   
    );
}
My Model Associations:
User hasOne Instructor Instructor belongsTo User Instructor hasAndBelongsToMany Subject Subject hasAndBelongsToMany Instructor
My form data looks like:
Array
(
    [User] => Array
        (
            [username] => MrInstructor
            [password] => cddb06c93c72f34eb9408610529a34645c29c55d
            [group_id] => 2
        )
    [Instructor] => Array
        (
            [name] => Jimmy Bob
            [email] => [email protected]
            [phone] => 1112223333
            [city] => Beverly Hills
            [zip_code] => 90210
            [states] => 5
            [website] => www.jimmybobbaseballschool.com
            [description] => Jimmy Bob is an instructor.
            [user_id] => 1
            [id] => 1
        )
    [Subject] => Array
        (
            [name] => hitting, pitching
        )
)
My function for processing the form looks like:
    function instructor_register()
    {
        $this->set('groups', $this->User->Group->find('list'));
        $this->set('states', $this->User->Instructor->State->find('list'));
        if (!empty($this->data)) {
            // Set the group to Instructor
            $this->data['User']['group_id'] = 2;
            // Save the user data
            $user = $this->User->save($this->data, true, array(
                'username',
                'password',
                'group_id'
            ));
            // If the user was saved, save the instructor's info
            if (!empty($user)) {
                $this->data['Instructor']['user_id'] = $this->User->id;
                $instructor = $this->User->Instructor->save($this->data, true, array(
                    'user_id',
                    'name',
                    'email',
                    'phone',
                    'city',
                    'zip_code',
                    'state_id',
                    'website',
                    'description'
                ));
                // If the instructor was saved, save the rest
                if(!empty($instructor)) {
                    $instructorId = $this->User->Instructor->id;
                    $this->data['Instructor']['id'] = $instructorId;
                    // Save each subject seperately
                    $subjects = explode(",", $this->data['Subject']['name']);
                    foreach ($subjects as $_subject) {
                        // Get the correct subject format
                        $_subject = strtolower(trim($_subject));
                        $this->User->Instructor->Subject->create($this->data);
                        $this->User->Instructor->Subject->set(array(
                            'name' => $_subject
                        ));
                        $this->User->Instructor->Subject->save();
                        echo '';
                        print_r($this->data);
                        echo '';
                    }
                }
            }
        }
    }
        © Stack Overflow or respective owner