如何轻松定义数据透视表的关系,其中第三列是laravel中另一个表的外键

时间:2015-11-25 09:51:32

标签: laravel laravel-5 eloquent pivot-table laravel-5.1

我是laravel 5的新手。我一直在开发一个客户端应用程序,我已经设置了这样的关系:

  1. Application和Cart之间的多对多关系为我提供了一个带有列

    的application_cart表
    • APPLICATION_ID
    • cart_id
  2. 样本模型

    class Application extends Eloquent
      {
        public function carts()
        {
            return $this->belongsToMany('App\Cart');
        }
    
      }
    
      class Cart extends Eloquent 
      {
            public function applications()
        {
            return $this->belongsToMany('App\Application');
        }
    
      }
    

    使用上面的模型,我能够在下面的视图中精美地显示记录:

     @foreach($cart->applications as $application)
        <td>{{ $application->student->last_name }}</td>
        <td>{{ $application->student->first_name }}</td>
     @endforeach
    

    最近,客户端已经更改了规范,因此我在数据透视表上添加了第三列supervisor_id   导致像这样的数据透视表结构:

    application_cart table

    • APPLICATION_ID
    • cart_id
    • supervisor_id(主管表的外键。已存在主管模型)

    目标是让我现在能够显示如下输出:

     @foreach($cart->applications as $application)
            <td>{{ $application->student->last_name }}</td>
            <td>{{ $application->student->first_name }}</td>
            <td>
                {{ $application->supervisor->user->name }} <!-- Display the "supervisor name" assign to the application (How can I beautifully display the supervisor name)-->
            </td>
       @endforeach
    

    如何在代码中轻松集成此新规范?

    修改

    关系如何形成的粗略图表:

    Sample Class Diagram

1 个答案:

答案 0 :(得分:0)

Application.php需要supervisor()关系

public function supervisor() {
    return $this->hasOne(App\Supervisor::class);
}

您的Supervisor.php模型需要user()关系

public function user() {
    return $this->belongsTo(App\User::class);
}

为了实现这一目标,您的supervisor表格必须有user_id列,而您的supervisor表格必须有application_id列。

您没有在数据透视表中放置第三个外键。保持application_cart不变,引用应用程序和购物车。虽然可以根据应用程序定义超级用户外键,因为我假设您每个应用程序都需要一个主管。