Articoli

Relazione uno a molti in un modello dati con Laravel Eloquent ORM

Nella modellazione dei dati Entity Relationship, esiste una relazione uno a molti quando un record in una tabella è associato a uno o più record di un’altra tabella.

La cardinalità indica la natura della relazione tra le entità, cioè l’entità padre può possedere più occorrenze di entità figlio.

Vediamo come laravel model ci aiuta nella gestione della relazione uno a molti, semplificandone le query.

Tempo di lettura stimato: 4 minuti

Relazione Uno a Molti

Una relazione uno a molti non è una proprietà dei dati stessi, ma della relazione tra le tabelle. Garantisce che ogni riga di una tabella corrisponda a più di una riga di un’altra tabella.

È una rappresentazione dell’associazione tra due entità in cui un’entità (il lato “uno”) può essere collegata a più istanze di un’altra entità (il lato “molti”), ma ciascuna istanza sul lato “molti” è associata a una sola esempio dal lato “uno”.

Se vuoi approfondire il caso della relazione uno a uno con Laravel model, allora leggi questo articolo Come gestire la relazione uno a uno in un modello dati con Laravel Eloquent ORM

Consideriamo ad esempio il database di una libreria. Potresti avere un’entità chiamata Editore e un’altra chiamata Libro. Una relazione uno a molti tra editore e libro indica che un editore può pubblicare molti libri, ma ogni libro è pubblicato da un solo editore.

Laravel Eloquent ORM Relazione Uno a Molti

Laravel Eloquent fornisce metodi completi per gestire le relazioni tra le tabelle del database. In questo articolo vedremo la relazione uno a molti, e come impostarla.

In una relazione uno a molti, un’entità (chiamiamola A) può essere associata a più istanze di un’altra entità (chiamiamola B). Tuttavia, ciascuna istanza di B appartiene a una sola istanza di A. Ad esempio, consideriamo uno scenario in cui un partito politico ha molti candidati. Ogni candidato appartiene a un partito politico, ma un partito politico può avere più candidati.

Impostazione relazione uno a molti

Innanzitutto, andiamo a creare i model sia per i partiti politici che per i candidati. Usiamo il comando artisan per generare questi model:

php artisan make:model PoliticalParty
php artisan make:model Candidate

Definiamo ora le relazioni nei modelli: nel model PoliticalParty, definiamo la relazione utilizzando il metodo hasMany

// app/Models/PoliticalParty.php
public function candidates()
{
    return $this->hasMany(Candidate::class);
}

Nel model Candidate, andiamo a definire la relazione inversa utilizzando il metodo belongsTo

Newsletter sull’Innovazione
Non perderti le notizie più importanti sull'Innovazione. Iscriviti per riceverle via e-mail.
// app/Models/Candidate.php
public function politicalParty()
{
    return $this->belongsTo(PoliticalParty::class);
}

L’impostazione dei laravel model per la definizione della relazione uno a molti, funziona se la tabella dei Candidati ha una chiave esterna. La chiave esterna deve essere definita su un campo denominato political_party_id, per collegare i candidati ai rispettivi partiti politici.

Una volta definite le relazioni, possiamo lavorare utilizzando le proprietà dinamiche di Eloquent. Ad esempio, per recuperare tutti i candidati di uno specifico partito politico, scriveremo questo:

// Find political party with id 1
$party = PoliticalParty::find(1);

// extract all candidates of political party where id is 1
$candidates = $party->candidates;

Esempio CRUD uno a molti

Inserire

Per aggiungere un nuovo candidato a un partito politico, creiamo una nuova istanza Candidate e la associamo al PoliticalParty appropriato:

// candidate John White of Political Party with id 1
$candidate = new Candidate([
    'political_party_id' => 1,
    'name' => 'John White',
    // other candidate attributes
]);
$party->candidates()->save($candidate);
Leggere

Per recuperare i candidati di un partito politico specifico

// Get Party's candidates
$candidates = $party->candidates;

Per recuperare il partito politico di un candidato specifico

// Get Party of a candidate
$party= $candidate->politicalParty;
Aggiornare

Per modificare i dati di uno specifico candidato, appartenente a un partito politico

$candidate = Candidate::find(1);
$candidate->update([
    'name' => 'Updated Name',
    // other updated attributes
]);
Cancellare

Rimuovere un candidato da un partito politico

$candidate = Candidate::find(1);
$candidate->delete();

Sfruttando le relazioni uno a molti in Laravel Eloquent, possiamo organizzare in modo efficiente i dati tra le tabelle correlate. Una buona conoscenza di queste relazioni, ci consente di creare applicazioni robuste ed efficienti.

Letture Correlate

Ercole Palmeri

Newsletter sull’Innovazione
Non perderti le notizie più importanti sull'Innovazione. Iscriviti per riceverle via e-mail.