Выполнение запросов во вложенном цикле

Прежде чем объяснить код, я должен объяснить структуру данных

Итак, у меня есть данные в этом формате

=>Department
==>Category
===>Sub-Category

Есть несколько отделов, имеющих несколько категорий, и эти категории имеют подкатегории.

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

Есть таблица, содержащая все данные и продукт. Я должен извлечь данные в собственном и положить в таблицу

Departments
Categories => fk is Departments id
Subcategories => fk is Categories id

Сначала я вставляю данные в отделы

Затем в категориях сначала я получаю идентификатор отдела, затем вставляю в таблицу категорий:

public function insertDataInCategory($data)
{
if(!empty($data)){
//pass data from hierarchy
foreach ($data as $dkey => $drow) {
//get id
$this->db->select('id');
$this->db->from('departments');
$this->db->WHERE('name',$dkey);
$query = $this->db->get();
//getting department it to identify category
$did = $query->result_array();

//adding category from department
foreach ($drow as $ckey => $crow) {
$cat_content = array(
'department_id' => $did[0]['id'] ,
'name' => $ckey ,
'description' => ''
);
$this->db->insert('categories', $cat_content);
}
}
}
}

в подкатегориях сначала я должен получить идентификатор отдела для категории, и после этого я идентифицирую, что эта подкатегория принадлежит этой категории.
Таким образом, здесь выполняется 3 запроса, которые увеличивают время выполнения.

public function insertDataInSubcategory($data)
{
//pass data from hierarchy
if(!empty($data)){
//department foreach
foreach ($data as $dkey => $drow) {
//category each
$this->db->select('id');
$this->db->from('departments');
$this->db->WHERE('name',$dkey);
$query = $this->db->get();
//getting department it to identify category
$did = $query->result();
foreach ($drow as $ckey => $crow) {
//get id
$this->db->select('id');
$this->db->from('categories');
$this->db->WHERE('name',$ckey);
$this->db->WHERE('department_id',$did[0]->id);
$query = $this->db->get();
//getting id of category of sub-category
$cid = $query->result_array();
//sub-category foreach
foreach ($crow as $skey => $srow) {
$scat_content = array(
'category_id' => $cid[0]['id'] ,
'name' => $skey ,
'description' => ''
);
$this->db->insert('sub_categories', $scat_content);
}
}
}
}
}

Время выполнения функций insertDataInCategory и insertDataInSubcategory резко возрастает. Подскажите пожалуйста как уменьшить это время. и правильный метод для вставки в таблицы

1

Решение

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

попробуйте этот код:

public function insertDataInCategory($data)
{
if(!empty($data)){
//pass data from hierarchy
foreach ($data as $dkey => $drow) {
//get id
//adding category from department
foreach ($drow as $ckey => $crow) {
$query = "INSERT INTO categories ";
$query.= "(department_id, name , description)";
$query.= "VALUES ((SELECT id FROM departments WHERE name = '$dkey') , '$ckey' , '')";
$this->db->query($query);
}
}
}
}

public function insertDataInSubcategory($data)
{
//pass data from hierarchy
if(!empty($data)){
//department foreach
foreach ($data as $dkey => $drow) {
foreach ($drow as $ckey => $crow) {
//sub-category foreach
foreach ($crow as $skey => $srow) {
$query = "INSERT INTO sub_categories ";
$query.= "(category_id , name , description)";
$query.= "VALUES ((SELECT id FROM categories WHERE name = '$ckey' && department_id = (SELECT id FROM departments WHERE name = '$dkey')) , '$skey' , '')";
$this->db->query($query);
}
}
}
}
}

Теперь установлено только одно соединение, и запись будет вставлена ​​намного быстрее.

1

Другие решения

Пожалуйста, измените функцию, как я упоминал ниже. Это решит проблему с вложенным циклом. Здесь я предполагаю, что $ this-> db-> insert возвращает идентификатор вставленной строки. Если он не возвращает идентификатор, вам нужно получить его с помощью запроса select и сохранить в указанной переменной.

 public function insertDataInDepartment($data)
{
if(!empty($data)){
//pass data from hierarchy
foreach ($data as $dkey => $drow) {
$dept_content = array(
'name' => $dkey ,
'description' => '' ,
'is_active' => 'y'
);
$intInsertId = $this->db->insert('departments', $dept_content);
insertDataInCategory($drow , $intInsertId);
}
}
}

public function insertDataInCategory($drow, $deptId)
{
foreach ($drow as $ckey => $crow) {
$cat_content = array(
'department_id' => $did[0]['id'] ,
'name' => $ckey ,
'description' => ''
);
$intCatId = $this->db->insert('categories', $cat_content);
insertDataInSubcategory($crow, $intCatId);
}
}

public function insertDataInSubcategory($data)
{
foreach ($crow as $skey => $srow) {
$scat_content = array(
'category_id' => $cid[0]['id'] ,
'name' => $skey ,
'description' => ''
);
$this->db->insert('sub_categories', $scat_content);
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector