php CODEIGNITER: автоматически вставлять parent_id в mysql

поэтому у меня есть веб-программа для загрузки файла TSV, который содержит следующую таблицу:

------------------------------------------------
SANDI     PENDAPATAN
------------------------------------------------
4.1       PENDAPATAN BUNGA/BAGI HSL & OPR UTAMA
410       PENDAPATAN BUNGA/BAGI HASIL
4100      PENDAPATAN BUNGA PENEMPATAN DANA
4101      PEND BNG/DISKON SRT BERHARGA YG DIBELI
4102      PENDAPATAN BNG.DOKUMEN/FASILITAS
4103      PEND BNG/PREMI TAGIHAN DERIVATIF
417       PENDAPATAN OPERASI UTAMA SYARIAH
4170      PENDAPATAN MARGIN MURABAHAH
4171      PENDAPATAN SALAM PARALEL
4172      PENDAPATAN ISTISHNA PARALEL
4173      PENDAPATAN BERSIH SEWA IJARAH

теперь посмотрим на полеСандиmsgstr «вы можете видеть, что идентификаторы отсортированы по иерархии.

4.1  => as a parent
410 and 417 => as a child of 4.1
4100-4103 => as a sub child of 410
4170-4172 => as a sub child of 417

Я хочу, чтобы эти плоские данные были древовидными:

4.1 PENDAPATAN BUNGA/BAGI HSL & OPR UTAMA
410 PENDAPATAN BUNGA/BAGI HASIL
4100 PENDAPATAN BUNGA PENEMPATAN DANA
4101 PEND BNG/DISKON SRT BERHARGA YG DIBELI
4102 PENDAPATAN BNG.DOKUMEN/FASILITAS
4103 PEND BNG/PREMI TAGIHAN DERIVATIF

Это пример структуры таблицы для сохранения записей:

COLUMN NAME        DATA TYPE
------------------------------------
id_detail          int
sandi              varchar
pendapatan         varchar
parent_id          int

Я уже искал данные об иерархии, родителя и ребенка и т. Д. Но я не нашел то, что мне нужно. Вопрос в том:
Как вставить поле «parent_id» автоматически на основе идентификаторов на «sandi» с зацикливанием PHP?

Пример:

id_detail  sandi         pendapatan                              parent_id
1          4.1           PENDAPATAN BUNGA/BAGI HSL & OPR         0
2          410           PENDAPATAN BUNGA/BAGI HASIL             1
3          4100          PENDAPATAN BUNGA PENEMPATAN DANA        2
4          4101          PEND BNG/DISKON SRT BERHARGA YG DIBELI  2

пожалуйста, помогите мне, с синтаксисом PHP CodeIgniter .. спасибо за ваше внимание

0

Решение

Основываясь на вашем подробном описании вашего вопроса (хотя вы ничего не пробовали), я покажу вам, как этого добиться в CodeIgniter.

сначала вам нужен контроллер

class ImportTSV extends CI_Controller
{

public function import()
{
$this->load->model("ImportTSV_Model");
$this->ImportTSV_Model->import();

}
}

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

class ImportTSV_Model extends CI_Model
{

private $strFile = "data.tsv";
private $masterNodeId = "41";
private $arrDataObjects = array();

public function __construct()
{
$this->prepareDataFromFile();
}public function import()
{
$objMasterNode = $this->arrDataObjects[$this->masterNodeId];
$this->save($objMasterNode);
}

private function save($objNode)
{
$arrInsertToDbData = array(
"sandi" => $objNode->sandi,
"pendapatan" => $objNode->pendapatan,
"parent_id" => $objNode->mysqlParentId
);

$this->db->insert("your_table", $arrInsertToDbData);
$id = $this->db->insert_id();

if (count($objNode->arrChilds) > 0)
{
foreach($objNode->arrChilds AS  $objNode)
{
$objNode->mysqlParentId = $id;
$this->save($objNode);
}
}
}

private function prepareDataFromFile()
{
$file = FCPATH."assets/".$this->strFile;

$objFile = new SplFileObject($file);
while(!$objFile->eof())
{
$line = $objFile->fgets();
$arrDataPerLine = explode("\t",$line);

$objTSVData = new TSVData_Object;
$objTSVData->prepareDataFromLine($arrDataPerLine);
$this->arrDataObjects[$objTSVData->formattedSandi] = $objTSVData;
}

foreach($this->arrDataObjects AS $objItem)
{
//set parent ID
$parent = substr($objItem->formattedSandi,0,-1);
if (isset($this->arrDataObjects[$parent]))  $this->arrDataObjects[$parent]->addChild($objItem);

}
}
}class TSVData_Object
{
public $sandi;
public $pendapatan;
public $formattedSandi;
public $mysqlParentId = 0;
public $arrChildObjects = array();public function prepareDataFromLine($arrLine)
{
$this->sandi = $arrLine[0];
$this->pendapatan = $arrLine[1];
$this->formattedSandi = str_replace(".","",$this->sandi);
}

public function addChild(TSVData_Object $objItem)
{
$this->arrChildObjects[] = $objItem;
}
}

я предположил, что ваш файл находится в каталоге FCPATH. «assets /».

0

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

Других решений пока нет …

По вопросам рекламы [email protected]