CakePHP сохранить ассоциацию отношений из трех моделей


У меня есть следующий вывод, который мне нужно вставить в базу данных:

Array
(
[Test] => Array
    (
    )

[Question] => Array
    (
        [0] => Array
            (
                [category_id] => 3
                [answer_style_id] => 2
                [Answer] => Array
                    (
                        [0] => Array
                            (
                                [capital_category_id] => 14
                                [correct] => 1
                            )

                       ...
         ...

Вкратце, в каждом тесте есть множество вопросов, и на каждый вопрос есть множество ответов, при этом каждая связанная модель имеет внешний ключ, который необходимо задать Cake (у каждого вопроса есть test_id, и у каждого ответа есть question_id).

Проблема в том, что когда я $this->Test->saveAll($data);, сохраняются только Тест и Вопросы, а не ответы.

Как я могу сохранить все данные, если Cake автоматически устанавливает внешний ключ для каждой связанной модели?

Спасибо вам!

Author: linkyndy, 2011-04-08

3 answers

Да, вы можете сохранять глубокие деревья моделей начиная с CakePHP 2.1 таким образом

$this->SomeModel->saveAll($data, array('deep' => true));

Ссылка здесь> http://book.cakephp.org/2.0/en/appendices/new-features-in-cakephp-2-1.html#model-saveall-model-saveassociated-model-validateassociated

 4
Author: steinkel, 2013-07-20 16:51:32

Я не уверен, но я думаю, что невозможно сохранить отношение третьего уровня.

Из Cakephp:

Сохранение связанных данных с помощью saveAll() будет работать только для непосредственно связанных моделей.

Вам придется извлечь данные третьего уровня и сохранить их отдельно от них.

 5
Author: Headshota, 2011-04-08 07:44:11

У меня есть три модели A, B и C

А хасМани Б B хасМани C

$A->saveAll() сохранит модель A&B, но не C

Вот обходной путь, который я использую:

В модели B переопределить последующее сохранение следующим образом

function afterSave($created) {
    if ($created) { // check if we are in save not update
        $this->data['B']['id'] = $this->id;
        $this->data['C'] = $this->data['B']['C'];
        $this->saveAll($this->data);
    }
}
 1
Author: Saleh Ghaleb, 2012-03-19 11:55:55