Связь Laravel между тремя таблицами

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

  • События
  • Возраст
  • Книги

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

  • возраст

    • я бы
    • имя
  • книги

    • я бы
    • заглавие
  • возраст_книга

    • я бы
    • age_id
    • book_id
  • Мероприятия

    • я бы
    • имя
  • event_age

    • я бы
    • 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?

Мне трудно понять, почему последняя таблица event_age_book кажется избыточной и может излишне усложнить вашу жизнь. Может быть, вы могли бы объяснить, зачем вам нужна эта последняя таблица?

J. A. Streich 26.04.2019 20:41

@ J.A.Streich Мне нужна книга event_age_book, потому что в event_age будет только несколько выбранных книг из этой эпохи, а не все книги, связанные с этой эпохой.

Eudoxus 26.04.2019 21:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Кажется, вам нужно всего 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 будет иметь только несколько выбранных книг, а не все книги, связанные с этим возрастом. Спасибо за ваш ответ.

Eudoxus 26.04.2019 21:02

Должно ли это быть age_event has.... (имеется в виду другая модель и куча других отношений) или это событие, в котором много книг.

J. A. Streich 26.04.2019 21:05

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

Eudoxus 26.04.2019 21:12

Я не думаю, что это возможно, потому что для возраста события я хочу выбрать только несколько книг из этого возраста, и выбранная книга также может быть выбрана для другого возраста в том же событии.

Eudoxus 26.04.2019 21:30

Отредактировано. Это грубый набросок. Его можно оптимизировать больше, но он может дать вам то, что показывает imgur.

J. A. Streich 26.04.2019 21:35

Спасибо за обновление вашего ответа, но я не думаю, что это работает, потому что он вернет все книги, выбранные для события для каждого возраста в этом событии, даже если я не выбрал книгу для определенного возраста для этого события.

Eudoxus 26.04.2019 21:38

Допустим, у нас есть книга1, книга2, книга3 и книга4, а также возраст 10 и 13 лет. Для возраста 10 у нас есть книга1, книга2 и книга3, а для возраста 13 у нас есть книга1 и книга4. Я должен быть в состоянии сказать, что для события в возрасте 10 лет у меня будет Книга 1 и Книга 3, а в возрасте 13 лет у меня будет только книга 4. Ваш код также возвращает book1 для возраста 13 лет, даже если он не был выбран для этого события.

Eudoxus 26.04.2019 21:43

Извиняюсь. Это должно исправить это. Гораздо лучше и короче.

J. A. Streich 26.04.2019 22:01

Другие вопросы по теме