【问题标题】:php CODEIGNITER: insert parent_id automatically to mysqlphp CODEIGNITER:将parent_id自动插入mysql
【发布时间】:2016-07-18 08:08:07
【问题描述】:

所以我有一个网络程序来上传一个包含如下表格的 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

现在查看“sandi”字段,您可以看到 ID 是分层排序的。

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

我已经搜索了层次结构数据、父子节点等。但我没有找到我需要的。问题是: 如何使用循环PHP根据“sandi”上的ID自动插入字段“parent_id”?

例子:

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 语法。谢谢您的关注

【问题讨论】:

    标签: php mysql database codeigniter hierarchical-data


    【解决方案1】:

    根据您对问题的详细描述(尽管您没有尝试任何事情),我将向您展示如何在 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/" 目录中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2012-01-29
      • 2014-12-05
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多