экземпляр codeigniter класса модели - PullRequest
9 голосов
/ 13 июня 2011

Я занимаюсь разработкой сайта с codeigniter.Теперь, обычно, когда вы используете класс в codeigniter, вы в основном используете его, как если бы это был статический класс.Например, если я возглавляю модель под названием «пользователь», я сначала загрузил бы ее, используя

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

, а затем я мог бы вызвать методы этого пользовательского класса, например

$this->user->make_sandwitch('cheese');

, вприложение, которое я создаю, я хотел бы иметь один класс UserManagement, который использует класс с именем 'user'.

, чтобы, например, я мог

$this->usermanager->by_id(3);

и этовернет экземпляр пользовательской модели, где идентификатор равен 3. Какой лучший способ сделать это?

Ответы [ 3 ]

17 голосов
/ 13 июня 2011

Классы моделей в CI - это не то же самое, что классы моделей в других синтаксисах. В большинстве случаев модели на самом деле представляют собой некую форму простого объекта со слоем базы данных, который взаимодействует с ним. С CI, с другой стороны, Model представляет интерфейс уровня базы данных, который возвращает общие объекты (они в некотором роде похожи на массивы). Я знаю, я чувствую себя обманутым.

Итак, если вы хотите, чтобы ваша Модель возвращала нечто, отличное от stdClass, вам нужно обернуть вызов базы данных.

Итак, вот что я бы сделал:

Создайте user_model_helper с вашим классом модели:

class User_model {
    private $id;

    public function __construct( stdClass $val )
    {
        $this->id = $val->id; 
        /* ... */
        /*
          The stdClass provided by CI will have one property per db column.
          So, if you have the columns id, first_name, last_name the value the 
          db will return will have a first_name, last_name, and id properties.
          Here is where you would do something with those.
        */
    }
}

В usermanager.php:

class Usermanager extends CI_Model {
     public function __construct()
     {
          /* whatever you had before; */
          $CI =& get_instance(); // use get_instance, it is less prone to failure
                                 // in this context.
          $CI->load->helper("user_model_helper");
     }

     public function by_id( $id )
     {
           $q = $this->db->from('users')->where('id', $id)->limit(1)->get();
           return new User_model( $q->result() );
     }
}
0 голосов
/ 13 июня 2011
class User extend CI_Model 
{
    function by_id($id) {
        $this->db->select('*')->from('users')->where('id', $id)->limit(1);
        // Your additional code goes here
        // ...
        return $user_data;
    }
}


class Home extend CI_Controller
{
    function index()
    {
        $this->load->model('user');
        $data = $this->user->by_id($id);
    }
}
0 голосов
/ 13 июня 2011

Используйте абстрактный шаблон фабрики или даже шаблон объекта доступа к данным, который выполняет требуемую работу.

...