Herramientas de usuario

Herramientas del sitio


cursos:yii:clases:activerecord:herencia

Modelos heredados de otros

Normalmente, para cada tabla de la base de datos tenemos un modelo, pero esto no tiene porque ser así. Hay casos en que es conveniente tener más de un modelo para una única tabla. El ejemplo típico es una tabla de usuarios donde confluyen distintas tipologías, que van a tener un comportamiento muy diferente dentro de la aplicación: Si en la tabla de usuarios de una academia tenemos alumnos y profesores, que se distinguen mediante un atributo (roles, tipousuario, etc..), podemos tener el modelo Usuarios genérico que será útil en las acciones generales del administrador y podemos tener dos clases derivadas de aquel, que nos simplificarán mucho las relaciones entre modelos, las vistas, etc..

class Alumnos extends Usuarios {
     public function defaultScope(){
       return array(
         'condition'=>'tipousuario="AL"'
       );
     }
 
     public function relations(){
		return array(
                        //Grupos en los que está matriculado
		       'gruposmat' => array(self::MANY_MANY, 'Grupos','gruposalumno(grupos_id,alumnos_id)'),	
		);
     }
 
     //Este método hay que ponerlo siempre, para que se instancie correctamente esta clase 
     public static function model($className=__CLASS__)	{
		return parent::model($className);
     }
}
class Profesores extends Usuarios {
     public function defaultScope(){
       return array(
         'condition'=>'tipousuario="PR"'
       );
     }
     public function relations(){
		return array(
                        //Grupos en los que es profesor
			'grupos' => array(self::HAS_MANY, 'Grupos', 'profesor_id'),
		);
     }
 
     //Este método hay que ponerlo siempre, para que se instancie correctamente esta clase 
     public static function model($className=__CLASS__)	{
		return parent::model($className);
     }
}

Como vemos, cada clase heredada puede tener sus propias relaciones diferenciadas, y el resto de clases se pueden relacionar con éstas en lugar de la genérica Usuarios, lo que nos evita tener que estar poniendo siempre filtros de la forma 'tipousuario=“XX”' cuando solamente queremos acceder a los alumnos o a los profesores