MySQL Self Join - Unire una tabella a se stessa

L'unione di una tabella a se stessa non è una funzione integrata, ma può essere effettuata semplicemente modificando il codice SQL generato dal Generatore CRUD.


Riguardo alle tabelle che utilizzano un join a se stesse

Alcune tabelle possono talvolta utilizzare una chiave relazionale per se stesse.
Ad esempio, una tabella che contiene categorie e sottocategorie allo stesso tempo (veda l'immagine sottostante).
In questo esempio, ogni sottocategoria ha una relazione con una categoria madre.

MySQL self-join structure example
Esempio di una tabella MySQL con una chiave relazionale che fa riferimento a se stessa

Come utilizzare le tabelle auto-giunte con il Generatore CRUD di PHP

PHP CRUD Generator è in grado di comprendere queste particolari unioni allo stesso modo delle relazioni abituali.
I moduli generati nell'Admin utilizzeranno queste relazioni senza alcun problema.

D'altra parte, la query SQL utilizzata per recuperare i record dall'elenco READ deve essere modificata per funzionare correttamente.

Ecco come fare:

  1. Crei la sua lista di lettura dal Generatore come di consueto.
  2. Apra il modello di classe PHP corrispondente alla sua tabella, che si trova in admin/class/crud/[NomeTabella].php.

  3. In questo file troverà 2 righe che costruiscono la query SQL di base.

    Con l'esempio di'categorie' che abbiamo fornito sopra, dovrebbe apparire così:

    $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. Deve modificare questa richiesta in:

    • utilizzi un alias per il nome della tabella che fa riferimento al campo relazionale.
    • sposti il LEFT JOIN nella variabile $qry_start.

    Il suo codice finale dovrebbe assomigliare a questo:

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

    In questo esempio, c2 è un alias per la tabella delle categorie.
    Lo utilizziamo con il parent_category_id


    Qui è disponibile un ottimo tutorial sull'autoadesione di MySQL.

Pagina principale del tutorial PHP CRUD