Algunos problemas o inconvenientes que se nos pueden presentar al momento de estar desarrollando en CodeIgniter 3
- Andrés Cruz
En esta entrada veremos varios elementos que te pueden pasar al momento de crear una app en CodeIgniter, varios inconvenientes o pequeñas situaciones que se te pueden complicar al momento de crear una aplicación en CodeIgniter.
Sin más que introducir, vamos a empezar a detallar algunas de las situaciones que considero te pueden dar problemas en algún punto del desarrollo de una aplicación en CodeIgniter:
Obtener las cantidades de registros de una consulta en CodeIgniter
Seguramente cuando haces una consulta en CodeIgniter en tus modelos sabes que existe el row()
que nos devuelve directamente un registro y el result
y result_array
que nos devuelve una colección de objetos; pero qué pasa si solo queremos una cantidad, y más nada, solamente queremos un valor que nos indique cuantos registros hay, entiéndase un 5 si existe 5 registros 20 si son 50 y así; esto es útil cuando queremos realizar operaciones como la paginación que lo tocamos en todos nuestros cursos en CodeIgniter en udemy y otras operaciones; para eso existe una función llamada num_rows()
que hace exactamente el trabajo; si tenemos el siguiente query:
$this->db->select('p.product_id');
$this->db->from("$this->table as p");
$this->db->where("p.active", "Si");
$query = $this->db->get();
return $query->result();
Lo podemos convertir a esto para que nos devuelva sólo el número que corresponde a la cantidad de registros:
$this->db->select('p.product_id');
$this->db->from("$this->table as p");
$this->db->where("p.active", "Si");
$query = $this->db->get();
return $query->num_rows();
Obtener los errores del formulario en un array, en un solo lugar
Seguramente sabes que cada campo de formulario lo puedes atachar a algún error que tu apliques al momento de definir tus reglas de validación de formularios en CodeIgniter; pero también podemos mostrar todos los errores en un solo lugar y en un formato dado; por ejemplo:
validation_errors()
Mostraría:
Y si le definimos unos parámetros a la misma; podemos definir en qué componente queremos embeber los errores:
validation_errors('<div class="alert alert-danger" role="alert">', '</div>')
Mostraría en el caso de que tengas configurado el CSS de Bootstrap en tu proyecto:
Obtener el query compilado
Muchas veces necesitamos conocer el query que nos construye CodeIgniter mediante la librería elaborada para tal fin: por ejemplo, si tenemos el siguiente query construido en CodeIgniter:
$this->db->select('p.*, c.url_clean as c_url_clean, c.name as category');
$this->db->from("$this->table as p");
$this->db->join("product_categories as c", "c.product_category_id = p.product_category_id");
$this->db->where_in("p.product_id", $products_id);
Podemos obtener el query compilado o generado en CodeIgniter mediante la funciòn: get_compiled_select()
:
$this->db->select('p.*, c.url_clean as c_url_clean, c.name as category');
$this->db->from("$this->table as p");
$this->db->join("product_categories as c", "c.product_category_id = p.product_category_id");
$this->db->where_in("p.product_id", $products_id);
$select = $this->db->get_compiled_select();
echo select;
Traer un conjunto de registros en base a un identificador
Una práctica muy común es que tu tengas un grupo de identificadores de registros que quieras obtener el detalle; para esto puedes emplear lo que sería la cláusula WHERE IN
de MySQL pero en CodeIgniter:
$this->db->where_in("p.product_id", $products_id);
En dónde $products_id
es un array en PHP:
array (size=2)
0 => int 1
1 => int 2
Un punto importante es que a la función de where_in
de CodeIgniter le pasamos un array de los elementos por el que queremos filtrar.
Obtener un grupo de elementos en una organización en específico
Este punto también es crucial, pero puede que resulte un poco difícil de entender; por ejemplo, supongamos que tenemos una colección de ID que queremos buscar el detalle como hicimos en el caso anterior, pero queremos que nos respete el orden de los IDs que le estamos pasando en la consulta devuelta; es decir, que si le pasamos los siguientes registros:
array (size=2)
0 => int 2
1 => int 1
2 => int 5
$this->db->select('p.*, c.url_clean as c_url_clean, c.name as category');
$this->db->from("$this->table as p");
$this->db->join("product_categories as c", "c.product_category_id = p.product_category_id");
$this->db->where_in("p.product_id", $products_id);
$this->db->order_by("p.product_id", "asc");
$query = $this->db->get();
return $query->result();
Queremos que nos devuelva el detalle en ese orden; primero el registro con identificador 2 luego el de 1 y de último el de 5; pero esto con el where_in
no funciona así; podrías emplear el ORDER BY pero este solo funciona por defecto trayendo los registros de mayor a menor o viceversa.
La función FIND_IN_SET en CodeIgniter
Para resolver el caso anterior, que consiste en indicarle a Codeigniter que queremos nos devuelva los registros en un orden en particular, tenemos el uso de la función FIND_IN_SET
de MySQL, la cual podemos emplear el CodeIgniter empleando un pequeño truco y combinando los dos pequeños trucos explicados en la sección anterior:
$this->db->select('p.*, c.url_clean as c_url_clean, c.name as category');
$this->db->from("$this->table as p");
$this->db->join("product_categories as c", "c.product_category_id = p.product_category_id");
$this->db->where_in("p.product_id", $products_id);
$select = $this->db->get_compiled_select();
$select = "$select ORDER BY FIND_IN_SET(p.product_id, '".implode(",", $products_id)."')";
$query = $this->db->query($select);
return $query->result();
Como puedes ver, directamente generamos nuestro query con CodeIgniter, luego generamos el query compilado y concatenamos la función para que nos devuelva los registros en el orden que le solicitamos:
SELECT `p`.*, `c`.`name` as `category`, max(i.image) as image
FROM `products` as `p`
LEFT JOIN `product_categories` as `c` ON `c`.`product_category_id` = `p`.`product_category_id`
LEFT JOIN `product_images` as `i` ON `i`.`product_id` = `p`.`product_id`
WHERE `p`.`product_id` IN('1')
GROUP BY `p`.`product_id` ORDER BY FIND_IN_SET(p.product_id, '1')
También es importante el uso de la función implode
de PHP que nos permite convertir nuestro array a un String separados por coma.
Y estos serían los errores que consideran más comunes; si se te ocurre algún otro, comentalo y seguramente lo agregare a la lista...
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter