Скажем, в моей БД есть 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;
Вы можете использовать функцию 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';
}
}
Общий способ вставки нескольких данных
$data = array(
array('father_id'=> 'id', 'child_name' => 'Unni' ),
array('father_id'=> 'id', 'child_name' => 'Kuttan' ),
//...
);
$this->db->insert('mytable', $data);