CakePHP обновляется, когда он должен вставить модель HasAndBelongsToMany - PullRequest
2 голосов
/ 15 февраля 2010

У меня небольшая проблема. Я делаю сайт, который имеет теги и вопросы. У меня есть модель Вопроса, модель тега, модель Вопроса, все прекрасно сочетается. Пользователь, спрашивая что-то, помещает теги в поле, разделенное пробелом (foo bar baz), как на stackoverflow.com.

Теперь вот код для проверки того, существует ли уже тег или нет, и ввод тега в базу данных и необходимые ассоциации:

    function create () {
        if (!empty($this->data)) {
            $this->data['Question']['user_id'] = 1;
            $question = $this->Question->save ($this->data);

            /**
            * Preverimo če se je vprašanje shranilo, če se je,
            * vprašanje označimo.
            */
            if ($question) {
                $tags = explode (' ', $this->data['Question']['tags']);
                foreach ($tags as $tag){
                    if (($tagId = $this->Tag->existsByName($tag)) != false) {
                        /**
                        * Značka že obstaja, torej samo povezemo trenuten
                        * id z vprašanjem
                        */
                        $this->QuestionsTag->save (array(
                            'question_id' => $this->Question->id,
                            'tag_id'      => $tagId
                        ));
                    }
                    else {
                        /**
                        * Značka še ne obstaja, jo ustvarimo!
                        */
                        $this->Tag->save (array(
                            'name' => $tag
                        ));

                        // Sedaj pa shranimo
                        $this->QuestionsTag->save(array(
                            'question_id' => $this->Question->id,
                            'tag_id'      => $this->Tag->id
                        ));
                        $this->Tag->id = false;
                    }
;               }
            }
        }
    }

Проблема в том, что Вопрос имеет идентификатор 1, и я хочу, чтобы он имел теги с идентификатором 1, 2, 3.

Когда вызывается 2-е и 3-е сохранение, Cake видит, что в таблице questions_tags уже есть вопрос с идентификатором 1, поэтому он просто обновляет тег.

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

Итак, есть ли способ предотвратить это? Предотвратить метод сохранения от ОБНОВЛЕНИЯ?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 февраля 2010

Это поведение не относится только к отношениям HABTM.Вы вызываете метод save() внутри цикла.После первого сохранения устанавливается значение id, и каждый последующий вызов сохранения видит идентификатор и предполагает, что это обновление.В цикле сначала необходимо вызвать model->create(), чтобы сбросить значение идентификатора, которое может существовать.

Из документов CakePHP в http://book.cakephp.org/view/75/Saving-Your-Data:

При вызове сохранения в цикле, не забудьте вызвать create ().

В вашем случае это будет выглядеть так:

$this->QuestionsTag->create();
$this->QuestionsTag->save (array(
                        'question_id' => $this->Question->id,
                        'tag_id'      => $tagId
                    ));
0 голосов
/ 15 февраля 2010

Если вы хотите убедиться, что новая запись (INSERT) сделана вместо обновления, вы можете установить $this->create(); прямо перед вызовом сохранения. См. http://book.cakephp.org/view/75/Saving-Your-Data (в верхней части страницы): при вызове save в цикле не забывайте вызывать create ().

0 голосов
/ 15 февраля 2010

Выезд saveAll . Вы можете сделать один звонок на $this->Question->saveAll(), и он сохранит все связанные с вами данные, которые вы предоставите. Обратите внимание, что с данными HABTM он выполнит DELETE для любого questions_tags, связанного с этим question_id, затем выполнит INSERT для всех tag_id, включенных в ваши данные.

...