Eloquent ORM: Relace 1:1 (one-to-one)

Základní vztah kdy jeden prvek z první skupiny je spojen s jedním jediným prvkem z druhé skupiny.

Např. jeden člověk má (has one) jedno rodné číslo. A jedno rodné číslo patří (belongs to) jednomu člověku.

Vztahy typu 1:1 obecně nemusíme, ale podle potřeby můžeme rozdělovat do více tabulek (entit).

Nastavení modelu

namespace App;

use Illuminate\Database\Eloquent\Model;

class Person extends Model
{

  /**
   * Get the pin record associated with the person.
   */
  public function pin()
  {
    return $this->hasOne('App\Pin');
  }

}

Pokud cizí klíč nazveme jinak než konvence Eloquentu očekává (v tomto případě user_id), uvedeme název cizího klíče jako druhý parametr:

return $this->hasOne('App\Pin', 'foreign_key');

Pokud je odlišně nazván i primární klíč (id), uvedeme jej jako třetí parametr:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

 

Inverzní vztah

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pin extends Model
{
  
  /**
   * Get the person that owns the pin.
   */
  public function person()
  {
    return $this->belongsTo('App\Person');
  }

}

Opět, pokud nazveme cizí klíč (v tomto případě person_id) jinak, uvedeme jej jako druhý parametr:

 return $this->belongsTo('App\User', 'foreign_key');

A pokud nadřazený model používá odlišný název primárního klíče (v tomto případě id) uvedeme jej jako třetí parametr:

return $this->belongsTo('App\User', 'foreign_key', 'other_key');

 

Získání dat

$pin = Person::find(1)->pin;

Výchozí data modelu

Vztah belongTo umožňuje definovat výchozí data pro neexistující model.

Pomocí metody withDefault():

return $this->belongsTo('App\User')->withDefault(
  'name' => 'Guest Author',
);

Případně pomocí closure funkce:

return $this->belongsTo('App\User')->withDefault(function ($person) {
  $person->name = 'Guest Author';
});

Viz vzor Null object pattern.

Zdroje

 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *