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.
DB schema
Ryšys 1:N sieja šias lenteles:
  • publishers - books
  • categories - books
  • countries - authors
Ryšys N:N sieja šias lenteles:
  • authors - books (per lentelę books_authors)
  • users - books (per lentelę orders)

Ryšiai 1:N

Ryšiui 1:N aprašyti naudojami metodai hasMany() 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 metodas belongsToMany().
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.

Paskutinį kartą puslapis keistas 2023-05-10

© Joana Katina 2016-2024. Visos teisės saugomos