猿问

三个表之间的Laravel关系

我有3张桌子:

  • 大事记

  • 时代

  • 图书

我通过以下方式将它们关联起来:

  • 年龄

    • ID

    • 名称

  • 图书

    • ID

    • 标题

  • age_book

    • ID

    • age_id

    • book_id

  • 大事记

    • ID

    • 名称

  • event_age

    • 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模型上进行操作?


BIG阳
浏览 199回答 1
1回答

幕布斯7119047

让我们回顾一下关系似乎您只需要3个模型和5个表。属于时代的书籍历代盛事年龄属于书籍年龄属于事件您的其他模型还可以,但是您的年龄模型缺少与Event的关系:class Age extends Model{&nbsp; &nbsp; public function books(): BelongsToMany&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->belongsToMany(Book::class)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->withTimestamps();&nbsp; &nbsp; }&nbsp; &nbsp; public function events(): BelongsToMany&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->belongsToMany(Events::class,'event_age')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->withTimestamps();&nbsp; &nbsp; }}这将允许:$books->ages;$events->ages;$ages->book;$ages->events;和链接...$books = collect();foreach($event->ages as $age){&nbsp; &nbsp; $books->merge($ages->books);}$books->unique();书籍和活动因此,我认为您不想要age_event_book。我认为您真正想要的是:活动属于图书书籍属于活动这样book_events- id- book_id- event_id- age_id而且您会在书中:public function events(){&nbsp; &nbsp; return $this->BelongsToMany('App\Event')&nbsp; &nbsp; &nbsp; &nbsp;->withTimestamps()&nbsp; &nbsp; &nbsp; &nbsp;->withPivot('age_id');}并且在情况下:public function books(){&nbsp; &nbsp;return $this->belongsToMany('App\Book')->withTimestamps()&nbsp; &nbsp; &nbsp; ->withPiviot('age_id')->groupBy('age_id');}给你:$event->books$book->events在前端在前端,我需要获取最新的事件,并按年龄分组书籍,并且书籍可以属于一个以上的年龄$event = Event::latest();$books = $event->books();然后放在刀片上@foreach($books as $age_id => $books)&nbsp; &nbsp; <h4>{{Age::find($age_id)->name}}</h4>&nbsp; &nbsp; @foreach($books as $book)&nbsp; &nbsp; &nbsp; &nbsp;<div>$book->name</div>&nbsp; &nbsp; @endforeach@endforeach有用的提示您正在提供关系表,您必须这样做,因为您没有遵循联接表的命名约定。约定是要加入的类应按字母顺序列出。所以age_event代替event_age。
随时随地看视频慕课网APP
我要回答