Отображение данных SQL на объекты

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

Например:
У меня есть это в моем классе модели:

<?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

Решение

Вы должны сделать это в модели — так как Result Функции 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;
}
}
}
}
}

и в приложении / config / hooks.php

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

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

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

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