我试图将我当前的项目从使用常规 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 留下模型,那么请向我解释这不会是一个巨大的浪费!