Laravel多对多关系5表

时间:2016-08-12 21:58:57

标签: php mysql laravel eloquent

我有一个名为Members的模型,另一个名为Awards,另一个名为Events。

每位会员可以多次获得多个奖项,每个奖项可以分配给多个会员,这些会员可以通过会员资料或活动结果奖励。

我的会员模型关系:

public function Awards()
    {
        return $this->belongsToMany('App\Award', 'award_members', 'member_id', 'award_id')
                    ->withTimestamps()
                    ->orderBy('award_members.created_at','desc');
    }

我的关系表:

Schema::create('award_members', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('club_id');
            $table->integer('award_id');
            $table->integer('member_id');
            $table->integer('event_id')->nullable();
            $table->timestamps();
        });

我的观看输出:

@foreach($member->Awards as $a)
  {{ $a->title }} | {{ $a->pivot->created_at }}
@endforeach

输出:

  • 奖励1 | 2016年12月12日
  • 奖励2 | 2016年12月8日
  • 奖励1 | 2016年11月8日

如果通过事件将事件名称添加到成员资料中,我还想输出如果存储在关系表中的事件名称。以上仅显示直接添加到会员的奖励详情。

在我的关系表中,来自某个事件的条目类似于:

  • id = 4
  • user_id = 1(与用户表相关)
  • club_id = 1(与俱乐部表相关)
  • award_id = 3(与奖励表相关)
  • member_id = 1(与会员表相关)
  • event_id = 1(与事件表相关但可以为NULL)

输入事件名称后如何输出?

1 个答案:

答案 0 :(得分:1)

我想当你拥有如此复杂的支点时,也许它可以保证自己是一个模特。事实上,如果你考虑一下,你的Award就是一种奖励,可以在不同情况下多次获得。某个时刻通过某个事件授予某人奖励......这是一个不同的概念。

假设您正在为库开发系统。你通常会有一本书的模型(标题,作者等)和另一本书#Book; BookCopy"或者" BookExemplar"它代表它的每个物理副本。当用户拿一本书时,他们真的在拿这本书。

所以我会说

// Member.php
public function Awards()
{
    return $this->hasMany(AwardGrant::class);
}
// AwardGrant.php
public function Award()
{
    return $this->belongsTo(Award::class);
}

public function Event()
{
    return $this->belongsTo(Event::class);
}