Laravel отношения между тремя таблицами - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть 3 таблицы:

  • События
  • Века
  • Книга

Который я связывал с ними следующим образом:

  • возраст

    • ID
    • имя
  • книги

    • ID
    • название
  • age_book

    • ID
    • age_id
    • book_id
  • события

  • имя

event_age

  • ID
  • event_id
  • age_id

event_age_book

  • event_age_id
  • book_id

По сути, книга может иметь много возрастов, возраст может иметь много книг, событие может иметь много возрастов, возраст события может иметь много книг.

Моя модель событий выглядит следующим образом и отлично работает для всех возрастов событий

class Event extends Model
{
    public function ages()
    {
        return $this->belongsToMany(Age::class, 'event_age');
    }
}

Возрастная модель:

class Age extends Model
{
    public function books(): BelongsToMany
    {
        return $this
            ->belongsToMany(Book::class)
            ->withTimestamps();
    }
}

Книжная модель

class Book extends Model
{
    public function ages(): BelongsToMany
    {
         return $this
            ->belongsToMany(Age::class, 'book_age', 'book_id','age_id')
            ->withTimestamps();
    }
}

У меня проблемы с выяснением того, как получить все книги о выпуске, возможно ли это сделать на модели Event?

1 Ответ

1 голос
/ 26 апреля 2019

Давайте рассмотрим отношения

Похоже, вам нужно только 3 модели и 5 таблиц.

  • Книги принадлежат векам
  • События принадлежат векам
  • Века принадлежат книгам
  • Века принадлежат событиям

С другими вашими моделями все в порядке, но в вашей возрастной модели отсутствует связь с Событием:

class Age extends Model
{
    public function books(): BelongsToMany
    {
        return $this->belongsToMany(Book::class)
            ->withTimestamps();
    }

    public function events(): BelongsToMany
    {
        return $this->belongsToMany(Events::class,'event_age')
            ->withTimestamps();
    }
}

Это позволило бы:

$books->ages;
$events->ages;
$ages->book;
$ages->events;

И цепочки ...

$books = collect();
foreach($event->ages as $age){
    $books->merge($ages->books);
}
$books->unique();

Книги и события

Итак, я не думаю, что вы хотите age_event_book с. Я думаю, что вы действительно хотите:

  • События принадлежат Книгам
  • Книги принадлежат событиям

такой, что

book_events
- id
- book_id
- event_id
- age_id

И вы бы в книге:

public function events()
{
    return $this->BelongsToMany('App\Event')
       ->withTimestamps()
       ->withPivot('age_id');
}

И в случае:

public function books()
{
   return $this->belongsToMany('App\Book')->withTimestamps()
      ->withPiviot('age_id')->groupBy('age_id');
}

Даю вам:

$event->books
$book->events

На передней панели

[O] На веб-интерфейсе мне нужно будет получить последние события и групповые книги по возрасту, а книги могут принадлежать более чем одному возрасту

$event = Event::latest();
$books = $event->books();

Тогда на клинке

@foreach($books as $age_id => $books)
    <h4>{{Age::find($age_id)->name}}</h4>
    @foreach($books as $book)
       <div>$book->name</div>
    @endforeach
@endforeach

Полезный совет

Вы предоставляете таблицу отношений, которую вы должны сделать, потому что вы не следовали соглашению об именах для объединения таблиц. Соглашение состоит в том, что соединяемые классы должны быть перечислены в алфавитном порядке. Так age_event вместо event_age.

...