为了账号安全,请及时绑定邮箱和手机立即绑定

三个表之间的Laravel关系

三个表之间的Laravel关系

PHP
BIG阳 2021-05-06 14:16:16
我有3张桌子:大事记时代图书我通过以下方式将它们关联起来:年龄ID名称图书ID标题age_bookIDage_idbook_id大事记ID名称event_ageIDevent_idage_idevent_age_bookevent_age_idbook_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 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

让我们回顾一下关系

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

在前端

在前端,我需要获取最新的事件,并按年龄分组书籍,并且书籍可以属于一个以上的年龄


$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。


查看完整回答
反对 回复 2021-05-21
  • 1 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信