我有3张桌子:
我通过以下方式关联他们:
年龄
书
年龄书
事件
事件年龄
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模型上进行?
答案 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
。