MySQL Self Join - Unir una tabla a sí misma

Unir una tabla a sí misma no es una característica incorporada, pero puede hacerse simplemente modificando el código SQL generado por el Generador CRUD.


Acerca de las tablas que utilizan una unión a sí mismas

Algunas tablas pueden utilizar a veces una clave relacional para sí mismas.
Por ejemplo, una tabla que contiene a la vez categorías y subcategorías (véase la imagen siguiente).
En este ejemplo, cada subcategoría tiene una relación con una categoría padre.

MySQL self-join structure example
Ejemplo de una tabla MySQL con una clave relacional que se refiere a sí misma

Cómo utilizar tablas auto-unidas con el Generador CRUD de PHP

El Generador PHP CRUD es capaz de entender estas uniones particulares de la misma manera que las relaciones habituales.
Los formularios generados en el Admin utilizarán estas relaciones sin ningún problema.

Por otro lado, la consulta SQL utilizada para recuperar registros de la lista READ debe editarse para que funcione correctamente.

He aquí cómo hacerlo:

  1. Cree su lista READ desde el Generador como de costumbre.
  2. Abra el modelo de clase PHP correspondiente a su tabla, que se encuentra en admin/class/crud/[TableName].php

  3. En este archivo encontrará 2 líneas que construyen la consulta SQL base.

    Con el ejemplo anterior de"categorías" que hemos dado, debería tener este aspecto:

    $this->join_query = ' LEFT JOIN `categories` ON `categories`.`parent_category_id`=`categories`.`id`';
    $qry_start = 'SELECT
    `categories`.`id`,
    `categories`.`parent_category_id` AS `categories_parent_category_id`,
    `categories`.`name`
    FROM categories';
  4. Tiene que editar esta solicitud para:

    • utilice un alias para el nombre de la tabla que hace referencia al campo relacional.
    • mueva el LEFT JOIN a la variable $qry_start.

    Su código final debería tener este aspecto:

    $this->join_query = '';
    $qry_start = 'SELECT
    `categories`.`id`,
    `c2`.`parent_category_id` AS `categories_parent_category_id`,
    `categories`.`name`
    FROM categories
    LEFT JOIN `categories` c2
    ON `categories`.`parent_category_id`=`c2`.`id`';

    En este ejemplo, c2 es un alias de la tabla categories.
    Lo utilizamos con el parent_category_id


    Aquí encontrará un tutorial muy bueno sobre MySQL Self Join

Página principal del tutorial PHP CRUD