Extending Multiple models in Codeigniter 2

谁说我不能喝 提交于 2019-12-06 03:25:03

问题


How do you set up CI2 to allow extending of multiple models?

I can only get it to extend one model (put in /application/core) named MY_Model (case sensitive).

To choose what model to extend I am doing; in the model..

require_once APPPATH.'core/MY_Another_model.php';
class Test_model extends MY_Another_model {
...
}

I can't find where in the core system code where it states only to allow models that are being extended to be called MY_Model.

Thank you for any and all help.


回答1:


As I said in this question about the controllers you just put both classes in the same MY_Model file. This file is used as part of the autoload feature of codeigniter, meaning that it will look for any files with the MY_ (or config defined) prefix.

You don't even need to call the class inside MY_Model you can potentially call it MY_Special_Model and have MY_Another_Model directly underneath




回答2:


I've tried Cubed Eye's way, and it works, but here's another option:

Try adding a model to your autoload.php file. It could inherit from MY_Model (which inherits from CI_Model), and any additional models you load could inherit from it:

class Extended_model extends MY_Model {
    public function __construct()
    {
        parent::__construct();
        $this->load->model('Another_model');
    }
}

(models/Extended_model.php)

class Another_model extends Extended_model {
}

(models/Another_model.php)

EDIT: I just realized that you're putting your extended model in the "core" folder. This is only necessary for classes that extend the core CI_* classes (i.e. MY_Controller, MY_Model, MY_Input, etc.). If you have a model extends MY_Model, put it in your models/ folder instead, and don't prefix it with "MY_".




回答3:


Eventually you may try this hack, using load_class function:

This is your model extension:
application/core/Special_model_class.php:

class CI_Special_model_class extends CI_Model {...}

The name of the php file is without the CI_ prefix, although the class itself is with prefix!

The model based on this class within the models/ folder:
application/models/one_model.php:

class One_model extends CI_Special_model_class {...}

In order to make this work, you should call the load_class function from the controller:
application/controllers/one_ctrl.php

....
load_class('Special_model_class', 'core');
$this->load->model('Special_model_class');
....

Eventually, you may try to call load_class within the model, right before defining it. application/models/one_model.php:

load_class('Special_model_class', 'core');
class One_model extends CI_Special_model_class {...}



回答4:


Here is the parent model class:

class MY_Common_Model extends CI_Model {

    function __construct() {
        parent::__construct();
    }
        function drop_table($table_name) {
        $this->connect();
         $this->dbforge->drop_table($table_name);

    }

}

Here is the child model class:

class MY_Model extends MY_Common_Model {
     function inset_table($table_name) {
        $this->connect();
        $this->insert_table($table_name);

    }
}

in model:

 $this->drop_table($edge_table);


来源:https://stackoverflow.com/questions/8136898/extending-multiple-models-in-codeigniter-2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!