public static function obtenerOfertasParaUsuario(Usuario $usuario, $intervalo = 2, $tipo = "DAY") { $ofertasTable = new \apf\db\mysql5\Table("ofertas"); $empresasTable = new \apf\db\mysql5\Table("empresas"); $empresasDatosTable = new \apf\db\mysql5\Table("empresas_datos"); $ofertasUbicacionTable = new \apf\db\mysql5\Table("ofertas_ubicacion"); $localidadesTable = new \apf\db\mysql5\Table("localidades"); $ofertasCategoriaTable = new \apf\db\mysql5\Table("ofertas_categoria"); $categoriasTable = new \apf\db\mysql5\Table("categorias"); $select = new \apf\db\mysql5\Select($ofertasTable); $fields = array("ofertas.id AS idOferta", "ofertas.email", "ofertas.titulo", "GROUP_CONCAT(categorias.id) AS categorias", "GROUP_CONCAT(localidades.id) AS localidades"); $select->fields($fields); //INNER JOIN ofertas_ubicacion ///////////////////////////////////////////////////////// $joinOfertasUbicacion = new \apf\db\mysql5\Join($ofertasUbicacionTable); $joinOfertasUbicacion->type("INNER"); $on = array(array("field" => "ofertas.id", "value" => "ofertas_ubicacion.id_oferta", "quote" => FALSE)); $joinOfertasUbicacion->on($on); $select->join($joinOfertasUbicacion); //INNER JOIN localidades ///////////////////////////////////////////////////////// $joinLocalidades = new \apf\db\mysql5\Join($localidadesTable); $joinLocalidades->type("INNER"); $on = array(array("field" => "localidades.id", "value" => "ofertas_ubicacion.id_localidad", "quote" => FALSE)); $joinLocalidades->on($on); $select->join($joinLocalidades); //INNER JOIN ofertas_categoria ///////////////////////////////////////////////////////// $joinOfertasCategoria = new \apf\db\mysql5\Join($ofertasCategoriaTable); $joinOfertasCategoria->type("INNER"); $on = array(array("field" => "ofertas_categoria.id_oferta", "value" => "ofertas.id", "quote" => FALSE)); $joinOfertasCategoria->on($on); $select->join($joinOfertasCategoria); //INNER JOIN categorias ///////////////////////////////////////////////////////// $joinCategorias = new \apf\db\mysql5\Join($categoriasTable); $joinCategorias->type("INNER"); $on = array(array("field" => "ofertas_categoria.id_categoria", "value" => "categorias.id", "quote" => FALSE)); $joinCategorias->on($on); $select->join($joinCategorias); //WHERE ///////////////////////////////////////////////////////// $where = array(); $tmpWhere = array(); $usuariosCategoria = new \apf\db\mysql5\Table("usuarios_categorias"); $selectCategorias = new \apf\db\mysql5\Select($usuariosCategoria); $selectCategorias->fields(array("id_categoria")); $selectCategorias->where(array(array("field" => "id_usuario", "value" => $usuario->getId()))); $tmpWhere[] = array("field" => "ofertas_categoria.id_categoria", "operator" => "IN", "value" => $selectCategorias); $prefUbicaciones = new \apf\db\mysql5\Table("usuarios_ubicaciones"); $selectLocalidades = new \apf\db\mysql5\Select($prefUbicaciones); $selectLocalidades->fields(array("id_localidad")); $selectLocalidades->where(array(array("field" => "id_usuario", "value" => $usuario->getId()))); $tmpWhere[] = array("field" => "ofertas_ubicacion.id_localidad", "operator" => "IN", "value" => $selectLocalidades); $postulacionesTable = new \apf\db\mysql5\Table("usuarios_postulaciones"); $selectPostulaciones = new \apf\db\mysql5\Select($postulacionesTable); $selectPostulaciones->fields(array("id_oferta")); $selectPostulaciones->where(array(array("field" => "id_usuario", "value" => $usuario->getId()))); $tmpWhere[] = array("field" => "ofertas.id", "operator" => "NOT IN", "value" => $selectPostulaciones); $prefCriterios = $usuario->getPreferencia("criterios"); if ($prefCriterios) { $cantCriterios = sizeof($prefCriterios); foreach ($prefCriterios as $key => $criterio) { if ($key == 0) { $tmpWhere[] = array("field" => "ofertas.titulo", "operator" => "LIKE", "value" => "%{$criterio}%", "begin_enclose" => TRUE); } else { if ($key == $cantCriterios - 1) { $tmpWhere[] = array("field" => "ofertas.titulo", "operator" => "LIKE", "value" => "%{$criterio}%", "end_enclose" => TRUE); } else { $tmpWhere[] = array("field" => "ofertas.titulo", "operator" => "LIKE", "value" => "%{$criterio}%"); } } } } foreach ($tmpWhere as $key => $value) { $where[] = $value; $op = $value["operator"] == "LIKE" ? "OR" : "AND"; $where[] = array("operator" => $op); } unset($where[sizeof($where) - 1]); if ($intervalo) { $where[] = array("operator" => "AND"); $where[] = array("field" => "ofertas.fecha_publicacion", "operator" => "BETWEEN", "value" => array("min" => "DATE_SUB(NOW(), INTERVAL {$intervalo} {$tipo})", "max" => "NOW()")); } $select->where($where); $select->group(array("ofertas.id")); $select->orderBy(array("fecha_publicacion"), "DESC"); $res = $select->execute($smartMode = FALSE); $ofertas = array(); $class = __CLASS__; foreach ($res as $r) { $oferta = new Oferta(); $oferta->setId($r["idOferta"]); $oferta->setEmail($r["email"]); $oferta->setTitulo($r["titulo"]); $ofertas[] = $oferta; } return $ofertas; }
/** *Funcion privada, generica para obtener datos de usuario y generar una instancia *se puso esta funcion como privada para poder utilizar las funciones derivadas *que correspondan a cada caso, por ejemplo si quiero obtener una instancia *del objeto Usuario mediante Email, entonces utilizaria la funcion publica y estatica *getInstanceByEmail. Y asi sucesivamente. */ private static function getInstance($field, $value) { switch (strtolower($field)) { case "id": case "id_usuario": $where = array(array("field" => "usuarios_datos.id_usuario", "value" => (int) $value)); break; case "email": $where = array(array("field" => "usuarios_datos.email", "value" => $value)); break; default: throw new \Exception("No puedo obtener una instancia mediante el campo {$field} con valor {$value}"); break; } $usuarios = new \apf\db\mysql5\Table("usuarios"); $usuariosDatos = new \apf\db\mysql5\Table("usuarios_datos"); $usuariosCategorias = new \apf\db\mysql5\Table("usuarios_categorias"); $usuariosCriterios = new \apf\db\mysql5\Table("usuarios_criterios"); $usuariosUbicaciones = new \apf\db\mysql5\Table("usuarios_ubicaciones"); $usuariosCv = new \apf\db\mysql5\Table("usuarios_cv"); $select = new \apf\db\mysql5\Select($usuarios); $fields = array("usuarios.id AS idUsuario", "usuarios.nombre", "usuarios.apellido", "usuarios_datos.salario", "usuarios_datos.clave", "usuarios_datos.fecha_nacimiento", "usuarios_datos.firma", "usuarios_datos.disponibilidad", "GROUP_CONCAT(DISTINCT usuarios_categorias.id_categoria) AS categorias", "usuarios_datos.email", "usuarios_cv.cv_file", "usuarios_cv.texto", "GROUP_CONCAT(DISTINCT usuarios_ubicaciones.id_provincia) AS provincias", "GROUP_CONCAT(DISTINCT usuarios_ubicaciones.id_localidad) AS localidades", "GROUP_CONCAT(DISTINCT usuarios_ubicaciones.id_barrio) AS barrios", "GROUP_CONCAT(DISTINCT usuarios_criterios.criterio) AS criterios"); $select->fields($fields); //INNER JOIN usuarios_datos ///////////////////////////////////////////////////////// $joinUsuariosDatos = new \apf\db\mysql5\Join($usuariosDatos); $joinUsuariosDatos->type("INNER"); $on = array(array("field" => "usuarios.id", "value" => "usuarios_datos.id_usuario", "quote" => FALSE)); $joinUsuariosDatos->on($on); $select->join($joinUsuariosDatos); //LEFT JOIN usuarios_categorias ///////////////////////////////////////////////////////// $joinUsuariosCategorias = new \apf\db\mysql5\Join($usuariosCategorias); $joinUsuariosCategorias->type("LEFT"); $on = array(array("field" => "usuarios_categorias.id_usuario", "value" => "usuarios_datos.id_usuario", "quote" => FALSE)); $joinUsuariosCategorias->on($on); $select->join($joinUsuariosCategorias); //LEFT JOIN usuarios_criterios ///////////////////////////////////////////////////////// $joinUsuariosCriterios = new \apf\db\mysql5\Join($usuariosCriterios); $joinUsuariosCriterios->type("LEFT"); $on = array(array("field" => "usuarios_datos.id_usuario", "value" => "usuarios_criterios.id_usuario", "quote" => FALSE)); $joinUsuariosCriterios->on($on); $select->join($joinUsuariosCriterios); //LEFT JOIN usuarios_cv ///////////////////////////////////////////////////////// $joinUsuariosCv = new \apf\db\mysql5\Join($usuariosCv); $joinUsuariosCv->type("LEFT"); $on = array(array("field" => "usuarios_datos.id_usuario", "value" => "usuarios_cv.id_usuario", "quote" => FALSE)); $joinUsuariosCv->on($on); $select->join($joinUsuariosCv); //LEFT JOIN usuarios_ubicaciones ///////////////////////////////////////////////////////// $joinUsuariosUbicaciones = new \apf\db\mysql5\Join($usuariosUbicaciones); $joinUsuariosUbicaciones->type("LEFT"); $on = array(array("field" => "usuarios_datos.id_usuario", "value" => "usuarios_ubicaciones.id_usuario", "quote" => FALSE)); $joinUsuariosUbicaciones->on($on); $select->join($joinUsuariosUbicaciones); //WHERE ///////////////////////////////////////////////////////// $select->where($where); $select->group(array("usuarios.id")); $res = $select->execute(); if (!sizeof($res)) { return FALSE; } $class = __CLASS__; $obj = new $class(); $obj->setId($res["idUsuario"]); $obj->setNombre($res["nombre"]); $obj->setApellido($res["apellido"]); $obj->setFechaNacimiento($res["fecha_nacimiento"]); $obj->agregarPreferencia("salario", $res["salario"], FALSE); $obj->agregarPreferencia("clave", $res["clave"], FALSE); $obj->agregarPreferencia("firma", $res["firma"], FALSE); $obj->agregarPreferencia("disponibilidad", $res["disponibilidad"], FALSE); //echo "<pre>"; //var_dump($res); //echo "</pre>"; if (sizeof($res["categorias"])) { $categorias = explode(',', $res["categorias"]); foreach ($categorias as $categoria) { $obj->agregarPreferencia("categorias", $categoria); } } if (sizeof($res["localidades"])) { $localidades = explode(',', $res["localidades"]); foreach ($localidades as $localidad) { $obj->agregarPreferencia("localidades", $localidad); } } if (sizeof($res["provincias"])) { $provincias = explode(',', $res["provincias"]); foreach ($provincias as $provincia) { $obj->agregarPreferencia("provincias", $provincia); } } if (sizeof($res["barrios"])) { $barrios = explode(',', $res["barrios"]); foreach ($barrios as $barrio) { $obj->agregarPreferencia("barrios", $barrio); } } if (sizeof($res["criterios"])) { $criterios = explode(',', $res["criterios"]); foreach ($criterios as $criterio) { $obj->agregarPreferencia("criterios", $criterio); } } $obj->setEmail($res["email"]); $obj->setCvFile($res["cv_file"]); return $obj; }