Come gestire la relazione uno a uno in un modello dati con Laravel Eloquent ORM

laravel eloquent model

Nella modellazione dei dati Entity Relationship, esiste una relazione uno-a-uno quando un record in una tabella è associato esattamente a un record in un’altra tabella e viceversa.

Tempo di lettura stimato: 3 minuti

Relazione Uno a Uno

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

Consideriamo alcuni esempi di relazione uno a uno, nella vita reale:

Paese – Capitale: Ogni paese ha esattamente una capitale. Ogni capitale è la capitale esattamente di un paese.

Persona – Impronte digitali: Ogni persona ha un set unico di impronte digitali. Ogni serie di impronte digitali identifica esattamente una persona.

E-mail – Account utente: Per molti siti Web, un indirizzo e-mail è associato esattamente a un account utente. Ogni account utente è identificato dal suo indirizzo email.

Laravel Eloquent ORM Relazione Uno a Uno

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

Scenario: Users e Phones

Ipotizziamo di avere due tabella: users e phones. Vogliamo introdurre un vincolo, cioè ogni utente deve avere un numero di telefono “univoco”, e che ogni numero di telefono può essere associato a un solo utente.

Database: migrations

Creiamo le migrations per le tabelle users e phones. Ecco come è possibile definire lo schema per queste tabelle:

// Create migration for 'users' table
Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamps();
});

// Create migration for 'phones' table with foreign key
Schema::create('phones', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->string('phone_no');
    $table->timestamps();

    // Define foreign key relationship
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

Nella tabella phones, impostiamo user_id come chiave esterna che fa riferimento alla colonna id nella tabella degli users. Se un utente viene eliminato, verrà eliminato anche il record telefonico associato (onDelete(‘cascade’)).

Impostazione del modello

Nell’ipotesi di avere due model: User e Phone, vediamo come impostare le relazioni con Laravel Eloquent.

Definiamo le relazioni in questi modelli:

// User model
class User extends Authenticatable {
    // Other attributes and methods...

    /**
     * Get the mobile number associated with the user.
     */
    public function mobile() {
        return $this->hasOne(Phone::class);
        // Alternatively, you can specify the full model path: 'App\\Phone'
    }
}

// Phone model (app/Phone.php)
class Phone extends Model {
    /**
     * Get the user that owns the phone.
     */
    public function user() {
        return $this->belongsTo(User::class);
    }
}

Il metodo hasOne nel modello User stabilisce la relazione uno-a-uno con il modello Phone.

Il metodo belongsTo nel modello Phone definisce la relazione inversa, permettendoci di accedere all’utente associato a un telefono.

Esempio di utilizzo

Inserire

Per inserire un record in Users e in Phones:

// Create a user and associate a phone
$user = User::create(['name' => 'John Doe', 'email' => 'john@example.com']);
$user->mobile()->create(['phone_no' => '123-456-7890']);
Leggere

Per leggere il numero di telefono (Phone) di un utente (User):

// Get user's phone number
$phone = $user->mobile;
Aggiornare
// Update user's phone number
$phone->update(['phone_no' => '987-654-3210']);
Cancellare
// Delete user (phone record will be deleted automatically)
$user->delete();

Sfruttando le relazioni uno a uno 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

Autore