CodeIgniter,模型和ORM,如何处理?

时间:2010-01-26 16:57:21

标签: php codeigniter orm

我从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等等。因此我认为这不是一个好的解决方案,因为我的班级Car的每个对象,都会包含很多重复数据,(它会有很差的性能!),不是吗?

未使用CodeIgniter的模型

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

10 个答案:

答案 0 :(得分:14)

你可能想要这样的东西:

   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;
        }
    }

希望有所帮助!

答案 1 :(得分:9)

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

答案 2 :(得分:4)

查看ORM的codeigniter wiki页面

http://codeigniter.com/wiki/ORM/

答案 3 :(得分:3)

对于未来的Google员工,here is a tutorial我写了关于如何将CodeIgniter 2与Doctrine 2集成的信息。

如果您有任何问题,请告诉我。

答案 4 :(得分:2)

我很幸运使用Propel和codeigniter。

答案 5 :(得分:2)

查看GAS ORM它听起来不错,方便易用。 CodeIgniter的ORM实现的一些功能:

  • 支持的数据库:cubrid,mssql,mysql,oci8,odbc,postgre,sqlite,sqlsrv。 (包括PDO,如果您与CI仓库保持同步)
  • 支持多个数据库连接。
  • 支持多种关系。
  • 支持复合键(用于定义关系的键)。
  • 从数据库表中自动创建模型,反之亦然。
  • 通过创建迁移文件自动同步模型表。
  • 按请求缓存。
  • 自引用和邻接列/数据(分层数据)。
  • 渴望加载以最大化您的关系查询(针对性能方式)。
  • 各种查找器方法(可与大多数CI AR链接)和聚合。
  • 使用最少的设置验证和自动映射输入集合。
  • Hooks指向控制你的模型。
  • 在您的模型中分享您的常用功能/库的扩展程序。
  • 交易和其他CI AR善良。
  • 包含phpunit测试套件,以确保大部分API一致性。

有一种形式有火花支持 - >所以它很容易安装

答案 6 :(得分:1)

您要做的是创建一个扩展ActiveRecord类的库。有些人领先于你:

http://codeigniter.com/wiki/ActiveRecord_Class/

线程中的好mods,这里:

http://codeigniter.com/forums/viewthread/101987/

如果您正在寻找应用程序通用的ORM方法,只需扩展ActiveRecord类即可。对于我的应用程序,知道表的结构允许我脚手架(自动生成)表单,并进行其他映射。我做API到API的映射,所以我在MyActiveRecord中包含一个GetStructure()方法,并从那里构建其他东西。

(RoR Snickering现在可以开玩笑了)

编辑虽然我是Doctrine的范围和力量的粉丝,但我认为对命令行使用的需求超出了CI的精神。什么是适合你的是什么适合你,但如果我要使用Doctrine,我不妨使用Symfony,对吧?或者RoR,就此而言,对吧?看看我在哪里用这个?适合时间的正确工具。

答案 7 :(得分:1)

我使用ProI的CodeIgniter,他们真的很好。我已经习惯了一段时间并且有一些webapps以这种方式工作。因为我发现了一些可怕的方法(一些包括修改Apache的配置!!)。我决定发布一篇关于如何做的博客文章。你可以阅读它here

希望我能帮忙!

答案 8 :(得分:0)

我认为php-activerecord是一个非常好的插入式ORM。我已经将它与Slim Framework一起使用了几次,我认为它将是使用CI本机模型类的一个很好的替代方案。以下是一些示例代码和链接:

$post = new Post();
$post->title = 'My first blog post!!';
$post->author_id = 5;
$post->save();

PHP ActiveRecord

答案 9 :(得分:-1)

我知道这已经很老了,但对于那些现在只使用codeigniter而且想要使用它的人来说,可以使用本教程将propel与codesigniter集成

http://llanalewis.blogspot.com/2013/06/installing-propel-in-codeigniter.html