Несколько вставок в цикле codeigniter

0

Скажем, в моей БД есть 2 таблицы. Один из них называется Father with Father_id как PK и имя Father_name как строка. Затем у меня есть вторая таблица как " Дети с Child_id" как " ПК", " Отец_ид" как " FK" и " Имя ребенка" как строка.

У детей были бы отношения с отцом как многие к одному. Множество детей одному отцу.

Поэтому скажем, что данные в моем контроллере выглядят так.

Array([Father_id] => 1 [Children] => Array([0] => John [1] => Peter [2] => Michael))

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

foreach($data as $row){
    for($temp = 0; $temp < count($data['Child_name']); $temp++){
        $query[$temp] = array('Father_id' => $data['Father_id'], 'child_name' => $row[$temp]);
    }
}

Итак, теперь это выглядит так,

Array([0]=>Array([Father_id] => 1 [Child_name] => John)[1]=>Array([Father_id] => 1 [Child_name] => Peter)[2]=>Array([Father_id] => 1 [Child_name] => Michael))

Я понимаю, как вставить это, мне просто нужно сделать еще один цикл foreach, или я могу просто удалить $temp в $query[$temp] и вместо этого поставить запрос вставки внутри этого цикла.

Моя проблема заключается в том, что, как я могу знать, что каждая вставка успешна, кроме проверки базы данных, я хотел бы иметь оператор возврата, например, если его единственная вставка, то если его успешное значение возвращает 1.

Также есть ли лучший способ сделать несколько вставок?

ОБНОВИТЬ:

После некоторого разрыва я вернулся и внес некоторые изменения.

Теперь это моя модельная функция:

        public function insert_children($data){
        foreach($data['child_name'] as $row){
            $query = array('father_id' => $data['father_id'], 'child_name' => $row);
            $result = $this->db->insert('children',$query);
        }
  //return something here
}

Очень важно вернуть что-то обратно в контроллер прямо? например, я хочу вернуться, если вставки были успешными или нет. Итак, есть ли какая-либо уже сделанная функция в кодерингите для этого? или я должен сделать сам.

например, я могу просто заставить переменную $temp содержать инкрементное значение каждый раз, когда вставка будет успешной, и сравните ее в конце цикла с count($data['children'])

Так что если есть 3 ребенка, значение $ temp должно быть 3 или 2 в зависимости от объявления, если я укажу его с 1 как $temp = 1;

Теги:
sql-server
codeigniter

2 ответа

0
Лучший ответ

Вы можете использовать функцию affected_rows() для каждого элемента цикла, чтобы проверить, вставлены ли данные или нет, и вернуть сообщение об ошибке только для данных, которые не вставлены:

foreach($data as $row) {
    for($temp = 0; $temp < count($data['Child_name']); $temp++){
        // note that I remove [$temp] below
        $query = array('Father_id' => $data['Father_id'], 'child_name' => $row[$temp]);
        $this->db->query($query);
        if($this->db->affected_rows() == 0) // data not inserted, return error message
        {
          $error[] = $row[$temp];
        }
    }
}

// shows error if one or more child name is not inserted
if (isset($error)) {
    foreach ($error as $child_name) {
        echo $child_name . ' is not inserted';
    }
}
  • 0
    Так что в моем операторе return я просто использую оператор if и проверяю, пусто ли $ error [], а затем возвращает true, иначе возвращает $ error?
  • 0
    Да, вы могли бы сделать условие от ошибок, подобных этому
Показать ещё 1 комментарий
1

Общий способ вставки нескольких данных

$data = array(
    array('father_id'=> 'id', 'child_name' => 'Unni' ),
    array('father_id'=> 'id', 'child_name' => 'Kuttan' ),
    //...
);

$this->db->insert('mytable', $data);
  • 0
    Это была моя цель. Моя проблема в том, как мне реструктурировать мой массив к этому.
  • 0
    Я думаю, что я не вставляю его в цикл foreach. поскольку он не может быть вставлен в качестве инертного значения, он будет показан как «массив», что будет ошибкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню