Php 三个表之间的拉维关系

Php 三个表之间的拉维关系,php,laravel,orm,eloquent,model,Php,Laravel,Orm,Eloquent,Model,我有三张桌子: 事件 年代 书 我用下面的方式把它们联系起来: 年代 身份证 名字 书 身份证 头衔 年鉴 身份证 年龄 书号 事件 身份证 名字 事件时间 身份证 事件id 年龄 事件·年龄·书 事件\u年龄\u id 书号 基本上,一本书可以有很多时代,一个时代可以有很多书,一个事件可以有很多时代,一个事件时代可以有很多书 我的事件模型看起来像这样,可以很好地获得所有事件年龄 类事件扩展模型 { 公共职能年龄() { 返回$this->belongstomy(

我有三张桌子:

  • 事件
  • 年代
我用下面的方式把它们联系起来:

  • 年代

    • 身份证
    • 名字
    • 身份证
    • 头衔
  • 年鉴

    • 身份证
    • 年龄
    • 书号
  • 事件

    • 身份证
    • 名字
  • 事件时间

    • 身份证
    • 事件id
    • 年龄
  • 事件·年龄·书

    • 事件\u年龄\u id
    • 书号
基本上,一本书可以有很多时代,一个时代可以有很多书,一个事件可以有很多时代,一个事件时代可以有很多书

我的事件模型看起来像这样,可以很好地获得所有事件年龄

类事件扩展模型
{
公共职能年龄()
{
返回$this->belongstomy(年龄::类,“事件年龄”);
}
}
年龄模型:

班级年龄扩展模型
{
公共功能书():属于
{
退还$this
->归属(书::类)
->带时间戳();
}
}
图书模型

类目扩展模型
{
公共函数ages():属于
{
退还$this
->属于名称(年龄::类,“图书年龄”、“图书id”和“年龄id”)
->带时间戳();
}
}
我很难弄清楚如何获取所有版本的书籍,是否可以在事件模型上这样做?

让我们回顾一下这些关系 看起来你只需要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\u event\u book
s。我想你真正想要的是:

  • 事件属于书本
  • 书籍属于事件
以致

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] 在前端,我需要按年龄获取最新的活动和分组书籍,书籍可以属于多个年龄

然后在刀刃上

@foreach($books as $age_id => $books)
    <h4>{{Age::find($age_id)->name}}</h4>
    @foreach($books as $book)
       <div>$book->name</div>
    @endforeach
@endforeach
@foreach($books as$age\u id=>$books)
{{Age::find($Age\u id)->name}
@foreach($books作为$book)
$book->name
@endforeach
@endforeach
有用的提示
您提供的是关系表,您必须这样做,因为您没有遵循连接表的命名约定。按照惯例,要加入的类应该按字母顺序列出。因此,
event\u event
而不是
event\u age

我很难弄清楚为什么你有最后一本表event\u age\u书似乎是多余的,而且容易让你的生活变得不必要的复杂。也许你可以解释一下为什么需要最后一张表?@J.A.Streich我需要事件年龄书,因为一个事件年龄只有几个选定的书,而不是所有与该年龄相关的书。我需要年龄事件书,因为年龄事件只有几个选定的书,而不是所有与该年龄相关的书。谢谢你的回复。那一定是一个老年活动吗。。。。(意味着另一个模型和一堆更多的关系)或者它比一个事件有很多书更重要。一个事件有很多书其实并不重要,只是事件年龄有很多书,事件有很多年龄,因为在前端,我需要按年龄获取最新的活动和分组书籍,书籍可以属于多个年龄段。我认为这是不可能的,因为对于活动年龄段,我只想从该年龄段中选择几本书,并且选定的一本书也可以为同一事件的另一年龄段选择。已编辑。这是一幅草图。它可以进行更多的优化,但它可以让你得到imgur所展示的东西。
@foreach($books as $age_id => $books)
    <h4>{{Age::find($age_id)->name}}</h4>
    @foreach($books as $book)
       <div>$book->name</div>
    @endforeach
@endforeach