waModel -> multipleInsert($data)

waResearchLab

Приветствую!

Есть такой кусок кода

                $team = array();
                foreach ($post['members'] as $member) {
                    if (!isset($member['member'])) {
                        continue;
                    }
                    $member['travel_id'] = $tid;
                    $team[] = $member;
                    $model_member->insert($member);
                }
                $model_member->multipleInsert($team);

Если остановиться на последней из приведенных выше строк, то видно следующее:

А после полного выполнения всего этого дела, в БД появляются следующие записи:

Т.е. insert($member) отрабатывает нормально, а multipleInsert($team) дублирует первый элемент передаваемого массива.

Хотел было уже кляузу в ошибки строчить, но подумалось вдруг это я где-то что-то упустил... Подскажите, пжста.

Спасибо.


13 октября 2016
  • Rat 13 октября 2016 17:22
    $model_member->insert($member);

    внутри foreach для отладки вставлено? В окончательном варианте его не будет там?

  • waResearchLab 13 октября 2016 17:34

    Угу, именно. Просто с разных сторон смотрел, чтоб понять где ерунда происходит. Ну и для наглядности результата.

  • info@ravencode.ru 16 октября 2016 12:36

    Посмотри не конфликтует ли с индексами таблицы, возможно метод multipleInsert переопределен в модели т.ч. нужно анализировать код + запрос выполняет адаптер $this->adapter->multipleInsert т.ч. проблема не в самом waModel.

  • waResearchLab 17 октября 2016 00:55

    Да нет, с моделью все в норме. Копнул чуть поглубже - проблема возникает на уровне функции multipleInsert($data) класса WaModel. И проявляется это только в случае когда элементы передаваемого массива содержат разный набор полей. Собственно именно это в моем случае и происходит.

  • waResearchLab 17 октября 2016 01:14

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

  • Rat 17 октября 2016 09:34
    порядок этих полей разный в разных элементах передаваемого массива

    Массив точно ассоциативный (слово "порядок" заставляет подозревать...)? И зачем в разных элементах массива передавать разные наборы полей? Может, стоит привести к общему виду все элементы (хотя бы для порядка, что ли).

  • waResearchLab 17 октября 2016 09:58
    Массив точно ассоциативный (слово "порядок" заставляет подозревать...)?

    Ну да. Это, правда, теоретическая выкладка, на практике не проверял, но там поля в multipleInsert складываются в отдельный массив на основе ключей первого элемента передаваемого массива. А значения, как понимаю глядя на результат в моем случае, в другой. Ну и подразумевается что и во всех последующих элементах этот порядок остается неизменным. Т.е. значения каждого переданного элемента массива будут записываться по порядку, а поля будут соответствовать порядку полей первого элемента. Повторюсь, это теоретическая выкладка. Но проверить не сложно.

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

    Ну вроде как да, с одной-то стороны... А с другой - вот этот конкретный пример вполне приличный, с т.з. порядка, имхо. Данные получены из формы с чекбоксами, отсюда и расхождение в составе полей у разных элементов, т.к. у одних элементов одни опции отмечены, у других - другие. С т.з. SQL никаких претензий. insert($data) тоже проглатывает нормально (и это правильно). Проблема только в логике multipleInsert($data). Нет, можно конечно усилием воли объявить что это не баг а фича, но тогда уж и в доке это все расписать, чтоб сюрпризов не было. А на данный момент описание соответствует только части действительности, хоть и наиболее встречаемой. Так что, имхо, ошибка.



Чтобы добавить комментарий, зарегистрируйтесь или войдите