渴望加载Laravel 5与两个外键的多对多关系

时间:2016-05-20 21:19:43

标签: sql laravel laravel-5 eloquent eager-loading

在我的应用程序中,我有两个表,一个用户表和一个表单表。 用户表是带ID的典型用户信息,表单表包含用户需要填写的字段列表。在我的 UserForms 数据透视表中跟踪了很多关系,如下所示:

  • ID
  • form_id(fk - >表格)
  • sender_id(fk - > users)
  • receiver_id(fk - > users)
  • 完成

用户可以向另一个用户发送他/她需要完成的表单,并且用户可以发送和接收许多表单。因此,表单可能有许多与之关联的用户。问题是当我调出一个表单并试图加载包含发件人接收者的用户信息的关系时(因为有两个外键)。好像我只能做一个或另一个。我的表单模型如下:

form.php的

class Form extends Model
{
    public function senders() {
        return $this->belongsToMany('App\User', 'user_forms', 'form_id', 'sender_id')->withPivot('receiver_id', 'completed');
    }

    public function receivers() {
        return $this->belongsToMany('App\User', 'user_forms', 'form_id', 'receiver_id')->withPivot('sender_id', 'completed');
    }
}

的FormController

public function show( $id )
{
    $form = Form::with('receivers')->findOrFail($id);  
    return view('form.show', ['form' => $form]);
}

view.blade.php

@foreach( $form->receivers as $receiver )
    <tr>
        <td>{{ $receiver->full_name }} </td>
        <td>{{ $receiver->pivot->sender_id }} </td>
    </tr>
@endforeach

如何让它加载归因于 sender_id 用户,这样我就可以在我的视图中执行以下操作:

{{ $receiver->pivot->sender->full_name }}

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为你不能使用隐式数据透视表的关系。

然而,你可以创建一个FormUser模型,设置相应的hasMany并属于关系,然后从那里访问关系。

也许我应该多解释一下。 您的FormUser将有两个belongsTo关系(都指向users表),您的视图代码将如下所示:

@foreach( $form->formusers as $relation )
    <tr>
        <td>{{ $relation->receiver->full_name }} </td>
        <td>{{ $relation->sender->full_name }} </td>
    </tr>
@endforeach