Algunos problemas o inconvenientes que se nos pueden presentar al momento de estar desarrollando en CodeIgniter 3

- Andrés Cruz

Algunos problemas o inconvenientes que se nos pueden presentar al momento de estar desarrollando en CodeIgniter 3

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:

Errores formularios

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:

Errores formularios bootstrap

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
Orden por defecto consulta
$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...

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.