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
-books
categories
-books
countries
-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.