CakePHP не сохраняет ключ BelongsTo

Я пытаюсь сохранить запись, принадлежащую другой модели. Тем не менее, я получаю сообщение об ошибке, что внешний ключ отсутствует. Документы CakePHP показывают примеры этой работы, но я не могу заставить ее работать.

Вот форма:

    echo $this->Form->create('Message', array('action'=>'add'));
                echo $this->Form->hidden('Ticket.id');
                echo $this->Form->input('Message.message');
                echo $this->Form->submit('Save Message');
                echo $this->Form->end();

Вот что возвращается контроллеру при отправке:

    Array(
        [Ticket] => Array
        (
            [id] => 2
        )

        [Message] => Array
        (
            [message] => Message text
        )

    )

Вот моя модель сообщения:

    class Message extends AppModel {
            public $belongsTo = array('Ticket');
    }

Вот моя модель билета:

    class Ticket extends AppModel {
        public $hasMany = 'Message';
    }

Вот моя логика контроллера:

        $this->Message->save($this->request->data);

Вот сообщение об ошибке, которое я получаю:

    Error: SQLSTATE[HY000]: General error: 1364 Field 'ticket_id' doesn't have a default value

В документах CakePHP довольно ясно сказано, что Cake получит идентификатор из массива Ticket. Единственный способ, которым я могу заставить это работать, - это вручную назначить идентификатор билета массиву сообщений.

    $this->request->data['Message']['ticket_id'] = $this->request->data['Ticket']['id']

Я не должен был этого делать. Где магия? Я прочитал по крайней мере 20 подобных сообщений, но ни один из них не был похож на этот (вероятно, потому что это настолько просто, что ни у кого нет этой проблемы, потому что это работает для них).

Я использую версию 2.4.2

Спасибо за любую помощь.


person Jondolar    schedule 10.12.2013    source источник
comment
Пожалуйста, включите свои ассоциации.   -  person Dave    schedule 10.12.2013


Ответы (1)


Не используйте Model::save() в этом случае, причина в том, что вы также хотите сохранить связанные данные, чтобы сохранить данные для основной модели вместе со связанными с ней моделями, вам нужно использовать Model::saveAssociated ().

Ваш контроллер должен выглядеть так

  $this->Message->saveAssociated($this->request->data);
person Guillermo Mansilla    schedule 11.12.2013
comment
Проблема с saveAssociated() заключается в том, что он сохраняет исходный билет, который мне не нужен. Фактически, единственное, что он сохраняет, — это уникальный идентификатор. ОБНОВЛЕНИЕ hd.tickets НАБОР id = 9, modified = '2013-12-11 22:29:25' ГДЕ hd.tickets.id = '9'. Я не хочу этого. Я просто хочу сохранить, но я хочу, чтобы он автоматически извлекал идентификатор билета из билета, как говорится в документации. - person Jondolar; 12.12.2013