2011-06-13 19 views
8

Estoy desarrollando un sitio con codeigniter. Ahora, normalmente cuando usas una clase en codeigniter, básicamente la utilizas como si fuera una clase estática. Por ejemplo, si la cabeza de un modelo llamado 'usuario', me gustaría primero cargarlo usandoinstancia codeigniter de la clase de modelo

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

y que, podría invocar métodos en que clase de usuario como

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

en la aplicación que I Estoy construyendo, me gustaría tener una clase UserManagement, que usa una clase llamada 'user'.

de manera que, por ejemplo, yo podría

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

y esto sería devolver un ejemplo del modelo de usuario en el que el id es 3. ¿Cuál es la mejor manera de hacerlo?

+1

La mejor manera es utilizar una ORM Doctrine es popular, y hay algunos tutoriales sobre integración con CodeIgniter – bassneck

+0

@bassneck thx para su sugerencia. Probablemente no voy a usar eso en mi proyecto actual, pero definitivamente voy a mirar la doctrina, se ve impresionante a primera vista. – bigblind

Respuesta

16

Las clases de modelo en CI no son exactamente lo mismo que las clases de modelo en otras sintaxis. En la mayoría de los casos, los modelos serán en realidad una especie de objeto simple con una capa de base de datos que interactúa con él. Con CI, por otro lado, Model representa la interfaz de la capa de la base de datos que devuelve objetos genéricos (en cierto modo son como matrices). Lo sé, me siento mintió también.

Por lo tanto, si desea que su Modelo devuelva algo que no sea stdClass, debe ajustar la llamada a la base de datos.

Por lo tanto, esto es lo que haría:

Crear una user_model_helper que tiene la clase del modelo:

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. 
     */ 
    } 
} 

En 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

impresionante, ¡hombre! – bigblind

+3

No necesita crear una instancia del User_model manualmente. Puede pasar el nombre de la clase del modelo como un parámetro de resultado() y devolverá una nueva instancia llena con los datos del DB. '$ q-> result ('User_model')' – jfadich

0

Utilice patrón de fábrica abstracto o incluso patrón de objeto de acceso a datos que hace el trabajo que necesita.

0
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); 
    } 
} 
Cuestiones relacionadas