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