Прежде чем объяснить код, я должен объяснить структуру данных
Итак, у меня есть данные в этом формате
=>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 резко возрастает. Подскажите пожалуйста как уменьшить это время. и правильный метод для вставки в таблицы
Проблема в том, что вы выполняете запросы несколько раз, что увеличивает время выполнения. Выполнение одного запроса сократит ваше время.
попробуйте этот код:
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);
}
}
}
}
}
Теперь установлено только одно соединение, и запись будет вставлена намного быстрее.
Пожалуйста, измените функцию, как я упоминал ниже. Это решит проблему с вложенным циклом. Здесь я предполагаю, что $ 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);
}
}