cakephp

CakePHP HABTM: gestire relazioni complesse con poco codice

Pubblicato il 11 Marzo 2021

Ci sono diverse motivazioni che possono spingere alla scelta di un framework mvc. Una di queste è sicuramente la possibilità di gestire le relazioni tra le entità del database in modo semplice tramite poche righe di codice. La vera potenza di un framework sta tutta lì, ti mette a disposizione componenti potenti che ti consentono di sviluppare la tua applicazione rapidamente senza dover “riscrivere la ruota” ogni volta.

Con l’esempio di oggi vediamo come gestire relazioni molti-a-molti tramite l’associazione “Has And Belongs To Many (HABTM)” di CakePHP.

Come esempio utilizzeremo le entità “posts” e “tags” per mettere in relazioni i post di un blog con i tag con cui etichettarli. Nel modello dell’entità Post andremo a scrivere la relazione:

public $hasAndBelongsToMany = array(
 'Tag' =>
        array(
            'className' => 'Tag',
            'joinTable' => 'tags_posts',
            'foreignKey' => 'post_id',
            'associationForeignKey' => 'tag_id',
	    'unique' => true
        )
);

Per poter creare la relazione è necessario aggiungere, nel database, una tabella chiamata con i nomi delle due entità al plurale, in questo caso tags_posts. La tabella conterrà due campi che corrispondono alle due chiavi esterne, in questo caso, i campi tag_id e post_id.

Fatto questo, nei metodi add (create) ed edit (update) andremo ad aggiungere il codice per richiamare le informazioni relazionate:

public function add() {
    
    $this->set('tags', $this->Post->Tag->find('list'));
		
    if ($this->request->is('post')) {
			
        $this->Post->create();
			
        if ($this->Post->save($this->request->data)) {

            $this->Session->setFlash(
                'Dati salvati.', 'flash_success'
            );
				
            return $this->redirect('/posts');
				
        }
			
    }
		
}

public function edit($id = NULL) {
		
    if (!$id) {
	throw new NotFoundException('Element not found.');
    }
	
    $row = $this->Post->findById($id);
		
    if (!$row) {
	throw new NotFoundException('Element not found.');
    }

    $this->set('tags', $this->Post->Tag->find('list'));
	
    if ($this->request->is(array('post', 'put'))) {
			
        $this->Post->id = $id;

        if ($this->Post->save($this->request->data)) {
				 
            $this->Session->setFlash(
                'Dati modificati.', 'flash_success'
            );
				
            return $this->redirect('/posts/edit/' .$id);
				
        }
			
    }
	
if (!$this->request->data) $this->request->data = $row;
		
}

Adesso resta un’ultima cosa da fare: modificare le viste nei file add e edit dell’entità post. Dobbiamo aggiungere il campo input che visualizzerà i tag e le relative relazioni.

    echo $this->Form->input('Tag', array(
        'multiple' => 'checkbox',
        'label' => false,
        'div' => false
    ));

Questo campo input visualizza, all’interno del form, un campo multi-select con cui si potranno selezionare i tag che si vuole relazionare al post. Come potete notare, ho specificato il valore checkbox per l’attributo multiple. Questo perchè preferisco la visualizzazione dei tag sottoforma di lista di campi checkbox.

Abbiamo finito. Come potete vedere, con poco codice abbiamo gestito una relazione di tipo molti-a-molti. Nell’esempio ho utilizzato il mio framework preferito ma, il concetto, vale anche se utilizzi un altro framework.

Alla prossima, Happy coding!

Condividi il post con i tuoi amici o colleghi
emawebdesign
Autore: emawebdesign

Full Stack Developer, SEO Specialist, esperto della trasformazione digitale con oltre 20 anni di esperienza.

Pubblicato in: