CakePHP обрабатывает все поля INT как идентификаторы для таблиц соединения? - PullRequest
0 голосов
/ 08 июня 2010

Я пытаюсь сохранить пользователя, его профиль и некоторые теги, а также мою таблицу соединений, которая связывает профиль и теги, все портится.

Модель профиля называется Instructor, модель тегов называется Subject. У Инструктора есть номер телефона и почтовый индекс, и по какой-то причине CakePHP считает, что эти поля следует использовать при создании записей в моей таблице присоединения.

Моя таблица присоединения всегда выглядит как:

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          |

Мои модели:

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'               => ''
        )   
    );
}

Мои модельные ассоциации:

User hasOne Instructor
Instructor belongsTo User
Instructor hasAndBelongsToMany Subject
Subject hasAndBelongsToMany Instructor

Данные моей формы выглядят так:

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
        )

)

Моя функция для обработки формы выглядит так:

    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 '<pre>';
                        print_r($this->data);
                        echo '
'; } } } } }

Ответы [ 3 ]

0 голосов
/ 09 июня 2010

Вы пробовали метод saveAll ?

if(!empty($this->data)) {
  $this->User->saveAll($this->data, array('validate'=>'first'));
}
0 голосов
/ 11 июня 2010

Я так и не узнал, почему CakePHP хотел использовать все мои поля INT в качестве идентификаторов, но я смог добиться этого, немного изменив ситуацию и применив функцию разбора из учебника Джейми Фэрхерста ,

Вместо того, чтобы сохранять каждый предмет по отдельности, они помещаются в массив и затем сохраняются одновременно с инструктором с помощью простого save ().

0 голосов
/ 08 июня 2010

Убедитесь, что вы установили внешние ключи в своих моделях.Поскольку именно это и будет использовать Cake, поскольку вы не указали свои модели, я бы посмотрел это первое место.

Следует также отметить, что вашей таблице соединения не нужно поле id, достаточно двух внешних ключей.

...