SQL数据映射到对象

时间:2017-04-26 09:00:44

标签: php codeigniter software-design

我想创建一个后端,检索一些信息并将其映射回对象。

例如: 我在我的模型课中有这个:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Core_Product_Model extends CI_model {

    //get the part id from an partnumber
    public function getIdFromPartnumber($partnumber){
        $this->db->select("id");
        $this->db->from('part_list');
        $this->db->where('part_number', $partnumber);
        $query = $this->db->get();

        return $query->result_object();
    }
}

我在控制器中处理它:

class Core_Product_Controller extends MX_Controller {
    public function getAllCrosslinks(){
            $response[] = array();
            $response['error'] = false;

            $partNumber = 100;

            $output = $this->Core_Product_Model->getIdFromPartnumber($partnumber);

            if(isset($output[0])){
                $response['output'] = $output;
                $response['valid'] = true;
            }

            echo json_encode($response);
        }
}

这有效,但不是我想要的。我想把一切都作为一个对象来检索。这不是一个问题,但这样做是一个好的设计吗?

一些Psuedo代码:

类产品:

class Product {
    private $productId;
    private $stock;

    function __construct($productId) {
        $this->productId = $productId;
    }

    function getProductId(){
        return $this->productId;
    }

    function stock(){

    }

    function setStock(Stock $stock){
        $this->stock = $stock;
    }

    function getStock(){
        return $this->stock;
    }
}

模特:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Core_Product_Model extends CI_model {

    //get the part id from an partnumber
    public function getIdFromPartnumber($partnumber){
        $this->db->select("*");
        $this->db->from('part_list');
        $this->db->where('part_number', $partnumber);
        $query = $this->db->get();

        $result = $query->result_object();

        //loop through result and map back to the Product class, save this to a array

        //return the array


        }
}

这是以这种方式做到这一点的好方法吗?

1 个答案:

答案 0 :(得分:1)

您必须在模型中执行此操作 - 因为CI的结果函数可以提供此功能。

我会告诉你一个方便的方法(但你应该知道 - 这只是一个开始)

在您的特定示例中,您可以执行以下操作

class Core_Product_Model extends CI_model {

    //get the part id from an partnumber
    public function getIdFromPartnumber($partnumber){
        $this->db->select("id");
        $this->db->from('part_list');
        $this->db->where('part_number', $partnumber);
        $query = $this->db->get();

        return $query->result("Product");
    }
}
  

请注意,由于命名冲突(例如,Product也可能是控制器的名称)以及CI无法使用命名空间,您应该使用后缀命名这些对象(如Product_Object)

接下来要想到的是,使用自动加载器作为钩子,因为你不想在你的模型中使用“require”线来

只需将此类放入您的application / hooks目录

即可
class AppAutoLoadObjects 
{
    private $arrPaths = array(
        'objects/',
    );


    public function initialize()
    {
        spl_autoload_register(array($this,'autoloadObjects'));
    }

    public function autoloadObjects($class)
    {
        if (strpos($class, 'CI_') !== 0)
        {
            foreach ($this->arrPaths as $dir)
            {
                $this->counter++;
                if (file_exists(APPPATH . $dir . '/' . $class . '.php'))
                {
                    require_once(APPPATH . $dir . '/' . $class . '.php');
                    return;
                }
            }
        }
    }
}

并在application / config / hooks.php

$hook['pre_system'] = [
    [
        'class' => 'AppAutoLoadObjects',
        'function' => 'initialize',
        'filename' => 'AppAutoLoadObjects.php',
        'filepath' => 'hooks'
    ]
];