我从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?以及如何在控制器中加载模型(其类)?
您可能想要这样的东西:
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页面
http://codeigniter.com/wiki/ORM/
对于未来的Google员工,这是我撰写的有关如何将CodeIgniter 2与Doctrine 2集成的教程。
如果您有任何问题,请告诉我。
我很高兴与Codeigniter一起使用Propel。
查看GAS ORM,听起来不错,方便并且易于使用。此针对CodeIgniter的ORM实现的一些功能:
- 支持的数据库:cubrid,mssql,mysql,oci8,odbc,postgre,sqlite,sqlsrv。(包括PDO,如果您与CI回购保持同步)
- 支持多个数据库连接。
- 支持多种关系。
- 支持复合键(用于定义关系的键)。
- 从数据库表自动创建模型,反之亦然。
- 通过创建迁移文件自动同步模型表。
- 每个请求的缓存。
- 自引用和邻接列/数据(分层数据)。
- 渴望加载以最大化您的关系查询(以性能方式)。
- 各种查找程序方法(可以与大多数CI AR链接)和聚合。
- 只需最少的设置即可进行验证和自动映射输入集合。
- 勾子可以控制您的模型。
- 扩展以在模型中共享您的通用功能/库。
- 交易和其他CI AR优势。
- 随附的phpunit测试套件可确保大多数API的一致性。
有一种形式具有火花支持->因此易于安装
您要做的是创建一个扩展ActiveRecord类的库。有人在你前面:
http://codeigniter.com/wiki/ActiveRecord_Class/
线程中的好mod,在这里:
http://codeigniter.com/forums/viewthread/101987/
如果您正在寻找应用程序通用的ORM方法,则只需扩展ActiveRecord类即可。对于我的应用程序,了解表的结构使我能够构建(自动生成)表单,并进行其他映射。我进行API到API的映射,因此我在MyActiveRecord中包含GetStructure()方法,并从那里构建其他内容。
(RoR窃笑现在可以烦扰了)
编辑:虽然我是Doctrine范围和功能的粉丝,但我认为对命令行使用的需求使其超出了CI的精神。最适合您的就是最适合您的,但是如果我要使用Doctrine,那么我最好还是使用Symfony,对吗?还是RoR,对吗?看到我在哪里玩这个吗?在正确的时间使用正确的工具。
我将CodeIgniter与Propel一起使用,它们确实混合得很好。我已经使用了一段时间,并以这种方式运行了一些Web应用程序。由于我发现了几种糟糕的方法(某些方法包括修改Apache的配置!)。我决定发布有关如何执行此操作的博客文章。您可以在这里阅读。
希望我能帮忙!
我认为php-activerecord是一个很好的嵌入式ORM。我已经将它与Slim Framework一起使用了几次,我认为这将是使用CI的本机模型类的理想选择。这是一些示例代码和链接:
$post = new Post();
$post->title = 'My first blog post!!';
$post->author_id = 5;
$post->save();
我知道这已经很老了,但是对于那些现在只使用codeigniter并想要使用orm的人来说,可以使用本教程将propel与codeigniter集成
http://llanalewis.blogspot.com/2013/06/installing-propel-in-codeigniter.html
文章标签:codeigniter , orm , php
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!