Consultas joins para la base de datos en CodeIgniter 4

- Andrés Cruz

In english
Consultas joins para la base de datos en CodeIgniter 4

En SQL, los JOINs son una operación que se utiliza para combinar dos o más tablas relacionales basadas en una columna o conjunto de columnas comunes, generalmente se usan las columnas de tipo FK o claves foraneas para hacer esta conexión entre distintas tablas. Se utilizan para recuperar datos de varias tablas relacionadas, permitiendo que los datos se presenten de manera más completa y significativa; por ejemplo, si tenemos una tabla de posts y otra de categorias, podemos indicar que un post contiene una categoría mediante una FK en la tabla de posts y luego, hacer un JOIN que permite conectar la tabla de posts con la de categoría y obtener el detalle completo del post; esto mismo podemos hacer con múltiples tablas.

Existen diferentes tipos de JOINs en SQL, como INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL OUTER JOIN, cada uno con un propósito diferente según la necesidad del usuario.

En la aplicación CodeIgniter 4, según la documentación, tenemos 3 tipos de uniones disponibles. Aquí están los siguientes:

  • Inner Join
  • Left Join
  • Right Join
     
  • Inner Join: esta unión trae los datos sobre la base de una condición de valor común entre dos o más de dos tablas. De acuerdo con la condición coincidente, traerá todos los datos que esperábamos. Elimina aquellas filas del conjunto de resultados que no tienen una condición coincidente.
  • Left Join: esto también funciona igual que la condición coincidente entre dos o más de dos tablas. Pero en este caso también obtenemos las filas de la tabla de la izquierda que no coinciden con la condición de la tabla del lado derecho. Significa que obtenemos todas las filas de la tabla de la izquierda, incluidos los valores de la tabla de la derecha.
  • Right Join: filas con las mismas condiciones coincidentes, incluidas todas las filas del lado derecho sin ninguna condición coincide.

El uso de los joins en CodeIgniter 4 es muy fácil y lo único que tenemos que hacer es, armar la consulta principal:

$query = $productModel->asObject()->select("pc.*, u.email, puc.description, puc.direction")

En este caso un modelo de ejemplo, llamado "productModel" y ahora, vamos a realizar el o los joins:

$query = $productModel->asObject()->select("pc.*, u.email, puc.description, puc.direction")
            ->join('products_control as pc', 'pc.product_id = products.id')

En el cual, puedes colocar tantos joins como necesites y/o permitan tus relaciones, en mi caso, un producto, tiene una relación foránea con "'products_control" y "'products_control" una relación foránea (fk) con "users" y finalmente con "'products_users_control"

$query = $productModel->asObject()->select("pc.*, u.email, puc.description, puc.direction")
            ->join('products_control as pc', 'pc.product_id = products.id')
            ->join('users as u', 'pc.user_id = u.id')
            ->join('products_users_control as puc', 'pc.id = puc.product_control_id');

Puntos claves

La función join recibe dos parámetros de manera obligatoria y un tercer opcional.

  1. Como primer parámetro indicamos el nombre de la tabla la cual queremos unir.
    1. De manera opcional, indicamos un alias mediante "as" para evitar repetir el nombre de la tabla cuando queremos referenciar la tabla: products_control as pc
  2. Como segundo parámetro indicamos la condición; que generalmente es colocar la igualdad de nuestra relación (fk)
  3. Como tercer parámetro puedes especificar el tipo de join: left, right, outer, inner, left outer, and right outer: join('products_control as pc', 'pc.product_id = products.id','left')

Sin mas que decir, las relaciones que empleamos en mi curso completo sobre CodeIgniter 4:

class ProductModel extends Model
{
    protected $table = 'products';
    protected $primaryKey = 'id';
    protected $allowedFields = ['name', 'code', 'description', 'entry', 'exit', 'stock', 'price'];
    public function get($id = null)
    {
        if ($id === null) {
            return $this->findAll();
        }
        return $this->asArray()
            ->where(['id' => $id])
            ->first();
    }
}
class ProductControlModel extends Model
{
    protected $table = 'products_control';
    protected $primaryKey = 'id';
    protected $allowedFields = ['product_id', 'type','count', 'created_at', 'updated_at','user_id'];
    protected $useTimestamps = true;
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    public function get($id = null)
    {
        if ($id === null) {
            return $this->findAll();
        }
        return $this->asArray()
            ->where(['id' => $id])
            ->first();
    }
}
class ProductUserControlModel extends Model
{
    protected $table = 'products_users_control';
    protected $primaryKey = 'id';
    protected $allowedFields = ['product_id', 'user_id', 'product_control_id', 'type', 'count', 'created_at', 'updated_at', 'description', 'direction'];
    protected $useTimestamps = true;
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    public function get($id = null)
    {
        if ($id === null) {
            return $this->findAll();
        }
        return $this->asArray()
            ->where(['id' => $id])
            ->first();
    }
}
<?php
class User extends BaseController{
    use ResponseTrait;
}

Recuerda que en el curso completo de CodeIgniter 4, tienes mucha mas informacion y datos sobre el uso de este framework.

Los JOINS, siempre los usamos para obtener los datos de varias tablas; administrar uniones en SQL es difícil, pero trabajar en Codeigniter también es sencillo de usar. Es una combinación izquierda o una combinación derecha en Codeigniter.
Solo necesitamos llamar a un método en Codeigniter $this->db->join('table'.'condition','left,right');. Las uniones toman tres parámetros: primero es la tabla, el segundo es la condición y el tercero es la unión izquierda o la unión derecha en Codeigniter.

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.