MySQL Self Join - Unindo uma tabela a ela mesma

Unir uma tabela a ela mesma não é um recurso incorporado, mas pode ser feito simplesmente modificando o código SQL gerado pelo CRUD Generator.


Sobre tabelas que usam uma união entre si

Algumas tabelas podem, às vezes, usar uma chave relacional para si mesmas.
Por exemplo, uma tabela que contém categorias e subcategorias ao mesmo tempo (veja a imagem abaixo).
Nesse exemplo, cada subcategoria tem um relacionamento com uma categoria principal.

MySQL self-join structure example
Exemplo de uma tabela MySQL com uma chave relacional que se refere a ela mesma

Como usar tabelas autounidas com o PHP CRUD Generator

O PHP CRUD Generator é capaz de entender essas uniões específicas da mesma forma que os relacionamentos usuais.
Os formulários gerados no Admin usarão esses relacionamentos sem nenhum problema.

Por outro lado, a consulta SQL usada para recuperar registros da lista READ deve ser editada para funcionar corretamente.

Veja como fazer isso:

  1. Crie sua lista READ a partir do Generator como de costume.
  2. Abra o modelo de classe PHP correspondente à sua tabela, que pode ser encontrado em admin/class/crud/[TableName].php

  3. Nesse arquivo, o senhor encontrará duas linhas que criam a consulta SQL básica.

    Com o exemplo de"categorias" que fornecemos acima, ele deve ter a seguinte aparência:

    $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. O senhor precisa editar essa solicitação para:

    • use um alias para o nome da tabela que se refere ao campo relacional.
    • mover o LEFT JOIN para a variável $qry_start.

    Seu código final deve ter a seguinte aparência:

    $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`';

    Neste exemplo, c2 é um alias para a tabela de categorias.
    Nós a usamos com o parent_category_id


    Há um tutorial muito bom disponível aqui sobre o MySQL Self Join

Página principal do tutorial PHP CRUD