2

我试图将我当前的项目从使用常规 CI 查询构建器迁移到使用 ORM,因为我的数据库越来越大,而且我有超过 20 个 FK 和表之间的关系。

所以我目前正在为 CI 寻找一个不错的 orm。我找到了 IgniteRecord,但我遇到了一个巨大的问题。

示例模型/users.php:

class user extends IgnitedRecord {

public function is_loged(){
return $this->session->userdata('user');
}

问题是它$this不再指向 CI,并且它 Undefined property: user::$session与任何 CI 类/库返回相同。

那么有没有办法解决这个问题?还是我需要$CI =& get_instance();在每个 ir 模型中使用?

由于我的模型包含我的大部分应用程序业务逻辑$CI =& get_instance();,我发现在所有模型中都这样做有点不舒服,

其他解决方案是将所有逻辑移入控制器!或者丢弃这个 orm 并坚持使用本机查询生成器:p。

** 所以下一个问题** 当使用 orm 时(我之前从未使用过),我应该将我的逻辑移动到控制器并只保留 orm 的模型!!!??

这将破坏我的 DRY 法力,因为很多时候我将属性/方法设置到模型中并从视图/其他控制器访问它们这是一个无法在控制器内部完成的功能,因为我无法从视图/其他控制器中引用控制器属性/方法.

问题示例:

class Auth extends CI_Controller{
public $msg='hello world';

function index(){
$this->load->view('login');
}
}


class user extends CI_MODEL{
public $msg='HELLO FROM YOUR MODEL';
}

/*VIEW */
<?
echo $this->user->msg;//WORKS fine.
echo $this->auth->msg;//WILL NOT WORK. will throw an UNIDENTIFIED auth error
?>

另外,我设计流程的方式通常是控制器从加载所有插件(例如:models/plugins/*.php)开始,这些插件设置一些数据属性供主模型使用,在加载所有插件后,控制器加载主模型并执行它逻辑并将结果发送回视图:)。

例子

models/plugins/settings.php:
    function config(){
        $this->msg = 'hello';
        $this->user = 'sam';
        return;
    }

models/hello.php
    function replace_sam (){
        $new='NONAME';
        if($this->settings->user=='sam') return $this->settings->msg.' '.$new
        else return $this->settings->msg.' '.$this->settings->user;
    }

controllers/home.php
    function index(){
        $this->load->model('plugins/settings');
        $this->settings->config();

        $this->load->model('hello');   

        echo $this->hello->replace_sam();
        //echo hello NONAME
    }

好吧,我希望你能从这个简单的例子中明白我的意思......所以你认为我应该重写所有东西并将逻辑移到控制器!

我很欣赏你的意见。所以如果你认为是的,我应该为 orm 留下模型,那么请向我解释这不会是一个巨大的浪费!

4

1 回答 1

1

如果您查看 system/core/model.php,您会发现它是一个非常简单的类。它所做的只是$CI =& get_instance()在需要时调用。因此,将相同__get()的方法添加到您的类将使它们与内置方法一样好。

于 2013-03-25T19:52:04.657 回答