Cakephp beforeSave не сохраняет новые данные при использовании saveAll? - PullRequest
3 голосов
/ 25 января 2011

У меня есть относительно простая модель записей только с пятью полями:

  1. id
  2. тип (какой тип данных у этой записи)
  3. количество (скольконезависимо от типа)
  4. единица (единица измерения типа)
  5. дата (datettime, когда эта запись была введена)
  6. user_id (идентификатор пользователя, который вводит

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

Когда яотправить форму $this->data выглядит следующим образом:

Array
(
    [Entry] => Array
        (
            [date] => 2011-01-07
            [0] => Array
                (
                    [id] => 1
                    [type] => Eat
                    [amount] => 1 Steak, one baked potatoe
                    [unit] => lunch
                    [time] => Array
                        (
                            [hour] => 13
                            [min] => 31
                        )

                )

            [1] => Array
                (
                    [type] => weight
                    [amount] => 78.5
                    [unit] => KG
                    [time] => Array
                        (
                            [hour] => 22
                            [min] => 22
                        )

                )

        )

)

Первая запись в $this->data['Entry']['date'] - это дата, которая должна использоваться ВСЕМИ записями. И так как также отсутствует user_id, я создал "beforeSave""функция в модели входа. Это выглядит следующим образом:

function beforeSave() {
    App::import('Component','Session');
    $this->Session = new SessionComponent();

    if (isset($this->data) && isset($this->data['Entry'])) {
        $date = $this->data['Entry']['date'];
        unset($this->data['Entry']['date']);

        foreach ($this->data['Entry'] as $n => $entry) {
            if (is_array($entry)) {
             $this->data['Entry'][$n]['date'] = $date . ' ' . $entry['time']['hour'] . ':' . $entry['time']['min'] . ':00';
                $this->data['Entry'][$n]['user_id'] = $this->Session->read('Auth.User.id');
            }
        }
        debug($this->data);

    }
    return true;
}

Я удаляю дату, добавляю ее вместе с записью времени пользователя, создавая таким образом запись даты и времени mysql и добавляя user_idвошел в систему пользователя. Прямо, действительно. Полученный массив (как вывод этой последней debug()) выглядит следующим образом:

Array
(
    [Entry] => Array
    (
        [0] => Array
            (
                [id] => 1
                [type] => Eat
                [amount] => 1 Steak, 1 baked potatoe
                [unit] => lunch
                [time] => Array
                    (
                        [hour] => 09
                        [min] => 31
                    )

                [date] => 2011-01-07 09:31:00
                [user_id] => 2
            )

        [1] => Array
            (
                [type] => Weight
                [amount] => 78.5
                [unit] => KG
                [time] => Array
                    (
                        [hour] => 22
                        [min] => 22
                    )

                [date] => 2011-01-07 22:22:00
                [user_id] => 2
            )

    )

)

Таким образом, это выглядит именно так, как я хочу, чтобы он выглядел, и его следует легко сохранить.Но когда я использую $this->Entry->saveAll($this->data['Entry']) для сохранения всех записей, он не только не работает, но и когда я отлаживаю $this->data непосредственно после saveAll, он выглядит точно так же, как и до функции saveAll - дата возвращается в массив,записи не имеют дату или запись user_id.

Я вижу, что перед вызовом SaveS я вижу, что он меняется $this->data, но где-то между концом beforeSave и использованием "saveAll" все мои изменения теряются и $this->data возвращается кэто оригинальное состояние.Следовательно, сохранение не происходит.

Ответы [ 4 ]

6 голосов
/ 03 апреля 2011

У меня была похожая проблема при попытке выполнить некоторую очистку через hasMany. Как оказалось, проблема заключается в том, как работает saveAll (). Данные $ this-> в контроллере не совпадают с данными $ this-> в обратном вызове Model :: beforeSave (), и они не синхронизированы. Когда вы вызываете Model :: saveAll (), передавая $ this-> data из контроллера, вы явно указываете модели "старую версию" массива данных. И когда вы смотрите в определение saveAll в cake / libs / model / model.php, оно просто делает:

if (empty($data)) {
   $data = $this->data
}

и больше ничего для синхронизации модифицированного массива $ data в модели, передаваемого параметром $ data из контроллера. Решение состоит в том, чтобы не передавать данные в saveAll (), а вместо этого установить данные в модели сначала с помощью Model :: set (), а затем вызвать Model :: saveAll () (без параметра $ data).

1 голос
/ 01 января 2016

Когда мы вызываем SaveAll, не передает обновленные / отправленные данные в модель beforeSave.Чтобы выйти из этой проблемы,

создайте массив tmp_data в модели

т.е.

var $tmp_data = array();

перед вызовом saveall, установите эту переменную, т.е.1010 * Затем измените код для модели-> beforeSaveBefore вместо $this->data use $this->tmp_data

0 голосов
/ 14 марта 2011

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

0 голосов
/ 13 марта 2011

Насколько я знаю, saveAll () updateAll () и deleteAll () не вызывают никаких обратных вызовов по умолчанию

, вам нужно включить их вручную (последний параметр метода)

...