三个表之间的Laravel关系

时间:2019-04-26 17:56:09

标签: php laravel orm eloquent model

我有3张桌子:

  • 事件
  • 年龄
  • 书籍

我通过以下方式关联他们:

  • 年龄

    • id
    • 名称
    • id
    • 标题
  • 年龄书

    • id
    • age_id
    • book_id
  • 事件

    • id
    • 名称
  • 事件年龄

    • 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 个答案:

答案 0 :(得分:1)

让我们回顾一下关系

似乎您只需要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