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

Posted

技术标签:

【中文标题】渴望加载 Laravel 5 与两个外键的多对多关系【英文标题】:Eager Loading Laravel 5 many-to-many relationship with two foreign keys 【发布时间】:2016-09-18 06:28:55 【问题描述】:

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

身份证 form_id(fk -> 表单) sender_id(fk -> 用户) receiver_id(fk -> 用户) 已完成

一个用户可以向另一个用户发送他/她需要填写的表单,并且一个用户可以发送和接收许多表单。因此,一个表单可能有许多与之关联的用户。问题是当我打开一个表单并尝试加载包含发送者 接收者的用户信息的关系时(因为有两个外键)。看来我只能做一个或另一个。我的表单模型如下所示:

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');
    

表单控制器

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_idUser,所以我可以在我看来做这样的事情:

 $receiver->pivot->sender->full_name 

提前致谢。

【问题讨论】:

【参考方案1】:

我认为您不能将关系与隐式数据透视表一起使用。

但是,您可以创建一个 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

【讨论】:

以上是关于渴望加载 Laravel 5 与两个外键的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 渴望加载多对多,仅获取一条记录(不是集合)

Laravel 与 uuid 的多对多关系返回总是空的

思考具有两个外键的一对多或多对多关系的正确方法是啥?

Laravel 4:具有额外关系的多对多

Prisma 删除与复合键的多对多关系

Laravel 5 雄辩的多对多关系问题