Может вставить данные HABTM, но не может обновить? - PullRequest
5 голосов
/ 31 августа 2011

Что не работает

Вкл. Форма обновления , если я изменяю значения флажков, эти значения habtm не сохраняются в базе данных .

Хотя в форме создания и обновления я использую тот же метод: $this->Employee->save($this->data), который должен автоматически обрабатывать данные HABTM.

Что работает

Я успешно настроил модель HABTM, следуя этому учебному пособию : Сотрудники имеют языки AndBelongsToMany (т. Е. Чтобы указать, какой сотрудник говорит на каком языке).

Я могу создать отношения : при создании нового сотрудникас помощью формы создания проверьте все языки, которые знает сотрудник, и он успешно сохранит в базу данных: сотрудник перейдет к employee таблица базы данных, язык к language и отношения перейдут к employee_language table.

В форме редактирования я вижу, какие чекбоксы я проверил при создании сотрудника.

В чем я (вероятно) был признан виновным

При оценке, что дапри создании и обновлении сотрудника происходит переход к базе данных. Я обнаружил, что структура переменных $this->data отличается.

При создании формы (проверьте 2 языка):

Create form

"$this->data"   Array [2]   
    Employee    Array [6]   
        name_lv John Doe    
        position_lv Computer administrator  
        enabled 0       
    Language    Array [1]   
        Language    Array [2]   
            0   1   
            1   5   

В форме обновления (отмечен дополнительный язык, поэтому 3 языка):

Update form

"$this->data"   Array [1]   
    Employee    Array [8]   
        name_lv John Doe    
        position_lv Computer administrator  
        Language    Array [3]   
            0   1   
            1   5   
            2   4   
        enabled 0   
        id  68  

Обратите внимание, что теперь языки доступны в $this->data["Employee"]["Language"], не так, как всоздание $this->data["Language"]

Обходной путь

Если я сделаю $this->data["Language"] = $this->data["Employee"]["Language"];, то значения будут сохранены (ууу), за исключением того, что в HABTM-таблице employee_language присутствуют повторяющиеся записи (о нет).

Итак, какой переключатель я переключаю, чтобы сделать мои флажки обновляемыми?

Подробнее (если хотите)

(модель) employee.php

class Employee extends AppModel {
  var $name = "Employee";

  var $hasAndBelongsToMany = array (
    "Language" =>
        array(
            "className"     => "Language",
            "conditions"    => array(
                "Language.enabled" => "1"
            )
        )
  );
  ...
}

(модель) language.php:

class Language extends AppModel {

  var $name = "Language";
  ...
}

(просмотр) admin_create.ctp (это форма создания.Этот фрагмент отображает флажки для всех доступных языков):

...
<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages
));  ?>
...

(просмотр) admin_update.ctp (я вижу, какие языки я проверял при создании сотрудника):

...
<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages,
        'selected' => $html->value('Employee.Language')
));  ?>
...

1 Ответ

0 голосов
/ 12 сентября 2011

Марк предоставил ответ в комментариях, который решает проблему:

... вам не нужно, и вы не должны использовать «selected» в массиве ввода формы.

Да, когда я удалил «выбранное» свойство, то внезапно я смог выполнить ОБНОВЛЕНИЕ данных HABTM.Итак, теперь мой элемент управления вводом выглядит так:

<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages
));  ?>

Нет возможности конвертировать комментарий в качестве ответа, пытаюсь связаться с @mark, чтобы опубликовать свой комментарий в качестве ответа, но никаких действий не предпринято, яотвечая на мой собственный вопрос, чтобы другие могли видеть, что у этого вопроса есть решение.Вот что предлагается на мета: https://meta.stackexchange.com/questions/1555/mark-a-comment-as-answer-to-a-question/1558#1558

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...