У меня есть 3 таблицы:
Который я связывал их следующим образом:
возраст
книги
возраст_книга
Мероприятия
event_age
event_age_book
По сути, у книги может быть много эпох, у эпохи может быть много книг, у события может быть много эпох, у эпохи события может быть много книг.
Моя модель событий выглядит так и отлично работает, чтобы получить все возрасты событий
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?
@ J.A.Streich Мне нужна книга event_age_book, потому что в event_age будет только несколько выбранных книг из этой эпохи, а не все книги, связанные с этой эпохой.






Кажется, вам нужно всего 3 модели и 5 таблиц.
Другие ваши модели в порядке, но в вашей возрастной модели отсутствует связь с Event:
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_books. Я думаю, что вы действительно хотите:
такой, что
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]n the frontend i'll need to get the most recent event and group books by age and books can belong to more than one age
$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.
Мне нужен age_event_book, потому что age_event будет иметь только несколько выбранных книг, а не все книги, связанные с этим возрастом. Спасибо за ваш ответ.
Должно ли это быть age_event has.... (имеется в виду другая модель и куча других отношений) или это событие, в котором много книг.
Событие, в котором много книг, на самом деле не имеет значения, просто возраст события, в котором много книг, и событие, в котором много возрастов, потому что во внешнем интерфейсе мне нужно получить самое последнее событие и сгруппировать книги по возрасту, а книги могут принадлежать большему количеству книг. чем один возраст.
Я не думаю, что это возможно, потому что для возраста события я хочу выбрать только несколько книг из этого возраста, и выбранная книга также может быть выбрана для другого возраста в том же событии.
Отредактировано. Это грубый набросок. Его можно оптимизировать больше, но он может дать вам то, что показывает imgur.
Спасибо за обновление вашего ответа, но я не думаю, что это работает, потому что он вернет все книги, выбранные для события для каждого возраста в этом событии, даже если я не выбрал книгу для определенного возраста для этого события.
Допустим, у нас есть книга1, книга2, книга3 и книга4, а также возраст 10 и 13 лет. Для возраста 10 у нас есть книга1, книга2 и книга3, а для возраста 13 у нас есть книга1 и книга4. Я должен быть в состоянии сказать, что для события в возрасте 10 лет у меня будет Книга 1 и Книга 3, а в возрасте 13 лет у меня будет только книга 4. Ваш код также возвращает book1 для возраста 13 лет, даже если он не был выбран для этого события.
Извиняюсь. Это должно исправить это. Гораздо лучше и короче.
Мне трудно понять, почему последняя таблица event_age_book кажется избыточной и может излишне усложнить вашу жизнь. Может быть, вы могли бы объяснить, зачем вам нужна эта последняя таблица?