CodeIgniter,模型和ORM,如何处理这个问题?

2022-08-30 12:45:01

我从CodeIgniter开始,在Google中潜入几个小时后,我有点困惑。

让我们尝试用一个简单的例子来解释我的问题:我有一个表格“car”,上面有“name”和“color”字段。因此,我想有一个php类Car,这样我的代码最终可以看起来像这样:

$car = new Car('BMW', 'red'); //new $car Object
$car->save(); //this will make an SQL insert to the table 'car'

//Lets query all cars
$cars = Car::get_all(); 
//cars will be an array of Car objects, (not a set of rows!)

因此,我正在寻找一些与RubyOnRails或Django(Python)非常相似的东西。我需要处理所有类型的关系,并且能够以真正的OOP + MVC方式编写代码。

这些是我获得它的失败方法:

使用外部ORM(DataMapper,Doctrine,AcidCrud...)

它们要么需要太多的设置,要么以糟糕的方式处理关系。

使用 CodeIgniter 类(扩展 CodeIgniter 的 Model 类)

class Car extends Model{
public function Car($name='',$color='')
{
    $this->name     =   $name;
    $this->color    =   $color;      
    parent::Model();
}
public function save()
{
    $data = array(
                   'name'   =>  $this->name ,
                   'color'  =>  $this->color 
                  );

    $this->db->insert('cars' $data);
}

等等...这种方法的问题在于,如果对一个$car对象进行var_dump(),我看到它包含来自CodeIgniter的很多东西,例如CI_Config,CI_Input,CI_Benchmark等对象。因此我认为这不是一个好的解决方案,因为我类汽车的每个对象,它都会包含很多重复的数据,(它会有很差的性能!),不是吗?

不使用 CodeIgniter 的模型

我可以在不从CodeIgniter的Model类扩展它们的情况下制作我的模型,然后使用常规的PHP5构造函数(__construct()而不是函数Car()),但是在这种情况下的问题是:我如何访问$db对象以使用CodeIgniter的ActiveRecord进行查询?以及,如何在控制器中加载模型(其类)?


答案 1

你可能想要这样的东西:

   class Cars {

    //List all neccessary vars here

    function __construct() {
        //get instance of Codeigniter Object and load database library
        $this->obj =& get_instance();
        $this->obj->load->database();
    }

//You can now list methods like so:
function selectCar($name, $color) {

        $this->obj->db->select('color')->from('car')->where('color', $color);
        $query = $this->obj->db->get();

        switch ($query->num_rows()) {
        case 0:
            return false;
            break;
        default:
            return $query->result();
            break;
        }
    }

希望有所帮助!


答案 2

尝试使用 Doctrine,是一个很棒的ORM,可以很容易地集成到CodeIgniter中。


推荐