开发者

Does CakePHP treat all INT fields as ID's for join tables?

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] => jbob@gmail.com
            [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->Instruc开发者_StackOverflowtor->Subject->save();

                        echo '
';
                        print_r($this->data);
                        echo '
'; } } } } }


I never did find out why CakePHP wanted to use all of my INT fields as ID's, but I was able to get this working by changing things up a little and utilizing a parse function from Jamie Fairhurst's tutorial.

Instead of saving each subject individually, they are put into an array and then saved at the same time with the instructor using a simple save().


Have you tried the saveAll method?

if(!empty($this->data)) {
  $this->User->saveAll($this->data, array('validate'=>'first'));
}


Make sure you set the foreign keys in your models. As this is what Cake will be using, as you haven't listed your models this is the first place that I would look.

<?php

class Profile extends AppModel {
    var $name = 'Profile';                
    var $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'    => 'user_id'
        )
    );  
}
?>

More in the book.

Should also mention that your join table doesn't need an id field, just the two foreign keys is fine.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜