Давайте рассмотрим отношения
Похоже, вам нужно только 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
.