CodeIgniter,模型和ORM,如何处理这个?
我从CodeIgniter开始,经过几个小时的谷歌潜水,我有点困惑。
让我们试着用一个简单的例子来解释我的问题:我有一个'名字'和'颜色'字段的表'汽车'。 因此,我想要一个PHP类的汽车,以便我的代码可以看起来像这样:
$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)中的东西非常相似的东西。 我需要处理所有types的关系,并能够以真正的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等等。所以我觉得这不是一个好的解决scheme,因为我的class车的每个对象,都会包含很多重复的数据,(会有不好的performance!),不是吗?
不使用CodeIgniter的模型
我可以使我的模型不需要从CodeIgniter的Model类扩展它们,然后使用常规的PHP5构造函数(__construct()而不是函数Car()),但是在这种情况下问题是:我如何访问$ db对象来查询使用CodeIgniter的ActiveRecord? 以及如何在控制器中加载模型(它的类)?
你可能想要这样的东西:
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; } }
希望有所帮助!
尝试与Doctrine ,是一个伟大的ORM,可以很容易地集成在CodeIgniter中。
看看ORM的codeigniter wiki页面
对于未来的Google员工, 这里是一个教程,我写了关于如何将CodeIgniter 2与Doctrine 2集成。
如果您有任何问题,请告诉我。
我使用Propel和codeigniter祝你好运。
检查出气体ORM听起来不错,方便和易于使用。 CodeIgniter的这个ORM实现的一些特性:
- 支持的数据库:cubrid,mssql,mysql,oci8,odbc,postgre,sqlite,sqlsrv。 (包括PDO,如果您保持与CI回购同步)
- 支持多个数据库连接。
- 支持多种关系。
- 支持复合键(用于定义关系的键)。
- 从数据库表中自动创build模型,反之亦然。
- 通过创build迁移文件来自动同步模型表。
- 按请求caching。
- 自引用和相邻列/数据(分层数据)。
- 渴望加载以最大化您的关系查询(对于性能方式)。
- 各种查找方法(可以链接大多数CI AR)和聚合。
- validation和自动映射input采集与最小的设置。
- 钩子控制你的模型。
- 在您的模型中扩展共享您的通用function/库。
- 交易和其他CI AR善良。
- 包括phpunittesting套件,以确保大部分的API一致性。
有一个forms与火花支持 – >所以它很容易安装
你想要做的是创build一个扩展ActiveRecord类的库。 有些人在你之前:
http://codeigniter.com/wiki/ActiveRecord_Class/
在线程中的好mods,在这里:
http://codeigniter.com/forums/viewthread/101987/
如果你正在寻找通用于你的应用的ORM方法,只要扩展ActiveRecord类即可。 对于我的应用程序,了解表的结构允许我脚手架(自动生成)的forms,并做其他映射。 我做了API到API的映射,所以我在MyActiveRecord中包含一个GetStructure()方法,并从那里构build其他东西。
(RoR窃听现在可以窃听)
编辑:虽然我是学说的范围和力量的粉丝,但我认为对命令行的使用要求超出了CI的精神。 对你来说什么是对的,对你来说是对的,但是如果我要使用教义,我不如使用Symfony,对吗? 或者RoR,对于这个问题,对吗? 看看我在哪里用这个? 正确的时间使用正确的工具。
我和Propel一起使用CodeIgniter,他们确实很好地混合在一起。 我已经使用了一段时间,并有几个webapps工作的方式。 因为我发现了一些可怕的方法来做到这一点(一些包括修改Apache的configuration!!)。 我决定发表一篇关于如何去做的博客文章。 你可以在这里阅读。
希望我能帮上忙!
我认为php-activerecord是一个非常好的embedded式ORM。 我已经使用了Slim Framework几次,我认为这将是使用CI本地模型类的一个很好的select。 以下是一些示例代码和链接:
$post = new Post(); $post->title = 'My first blog post!!'; $post->author_id = 5; $post->save();
PHP的ActiveRecord
我知道这是相当古老的,但对于那些现在只是使用codeigniter,并想与它一起使用orm的人可以使用本教程将propel与codeigniter
http://llanalewis.blogspot.com/2013/06/installing-propel-in-codeigniter.html