Laravel 10.x pamoka. Modelių (objektų) ryšiai
Laravel karkasas savaime nemoka iš duomenų bazės atpažinti ryšių tarp lentelių, todėl juos turi nurodyti programuotojas.
Kuriama sistema naudoja dviejų tipų ryšius: 1:N ir N:N.

Ryšys 1:N sieja šias lenteles:
Kadangi knyga priklauso kokiam nors leidėjui ir kategorijai, todėl modelio
Vienas autorius gali parašyti daug knygų, todėl modelio
Kuriama sistema naudoja dviejų tipų ryšius: 1:N ir N:N.

Ryšys 1:N sieja šias lenteles:
publishers-bookscategories-bookscountries-authors
authors-books(per lentelębooks_authors)users-books(per lentelęorders)
Ryšiai 1:N
Ryšiui 1:N aprašyti naudojami metodaihasMany() ir belongsTo().Kadangi knyga priklauso kokiam nors leidėjui ir kategorijai, todėl modelio
Book klasėje įrašome du belongsTo() metodus:
class Book extends Model
{
...
public function category()
{
return $this->belongsTo(Category::class)->withDefault();
}
public function publisher()
{
return $this->belongsTo(Publisher::class)->withDefault();
}
}
Atitinkamai vienai kategorijai gali būti priskirta daug knygų, todėl modelio Category klasėje įrašome metodą hasMany():
class Category extends Model
{
...
public function books()
{
return $this->hasMany(Book::class);
}
}
Ir atitinkamai vienas leidėjas gali būti priskirtas daugeliui knygų, todėl modelio Publisher klasėje įrašome metodą hasMany():
class Publisher extends Model
{
...
public function books()
{
return $this->hasMany(Book::class);
}
}
Autorius priklauso kuriai nors šaliai, todėl modelio Author klasėje įrašome belongsTo() medotą:
class Author extends Model
{
...
public function country()
{
return $this->belongsTo(Country::class)->withDefault();
}
}
Atitinkamai vienai šaliai gali būti priskirta daug autorių, todėl modelio Country klasėje įrašome metodą hasMany():
class Country extends Model
{
...
public function authors()
{
return $this->hasMany(Author::class);
}
}
Ryšiai N:N
Ryšiui N:N aprašyti naudojamas metodasbelongsToMany().Vienas autorius gali parašyti daug knygų, todėl modelio
Author klasėje įrašome metodą belongsToMany():
class Author extends Model
{
...
public function books()
{
return $this->belongsToMany(Book::class, 'books_authors', 'author_id', 'book_id');
}
}
Atitinkamai viena knyga gali turėti daug autorių ir viena knyga gali būti užsakyta daug kartų, todėl modelio Book klasėje įrašome du belongsToMany() metodus:
class Book extends Model
{
...
public function authors()
{
return $this->belongsToMany(Author::class, 'books_authors', 'book_id', 'author_id');
}
public function orders()
{
return $this->belongsToMany(Order::class, 'orders', 'book_id', 'user_id');
}
}
Atitinkamai vienas naudotojas gali užsakyti daug knygų, todėl modelio User klasėje įrašome metodą belongsToMany():
class User extends Authenticatable
{
...
public function orders()
{
return $this->belongsToMany(Order::class, 'orders', 'user_id', 'book_id');
}
}
Daugiau apie modelius skaitykite oficialioje Laravel 10.x dokumentacijoje, skiltyje Eloquent: Relationships.