数据透视模型中的调用关系

时间:2019-05-17 16:56:34

标签: php eloquent relationship

我尝试像这样的负载关系:

 return $task->load('users', 'creator', 'attachments', 'messages.creator');

与某些字段之间的“用户”多对多

user
 id
 name
 ...
task
 id
 name
 ...
task_user
 user_id
 task_id
 task_status_id

我的数据透视模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class TaskUser extends Pivot
{
    public $incrementing = true;

    public function status()
    {
        return $this->hasOne(TaskStatus::class);
    }
}

如何正确加载“状态”关系?

1 个答案:

答案 0 :(得分:0)

如果Laravel提供了一种在枢轴中传递闭包的方法,那一点也不难,但是目前有两种解决方案可以加载枢轴关系

1。懒惰的人渴望装载一切。

# App\Task.php

public function users()
{
    return $this->belongsToMany(App\User::class)->using(App\TaskUser::class)->withPivot('task_status_id');
}
$task->load('users', ...);
$task->users->each(function ($user) {
    $user->pivot->load('status');
});

问题:这将查询与Task相关的每个用户。除非您对结果进行分页,否则这就是经典的N + 1问题。

2。使用hasMany和belongsTo代替。

  • 定义$ user-> tasks_user关系(用户hasMany TaskUser)
  • 定义$ task-> tasks_user关系(任务hasMany TaskUser)
  • 定义反函数(TaskUser属于用户,TaskUser属于Task)
  • 定义最后一个task_user关系(TaskUser具有一个TaskStatus)(虽然对我来说看起来像是一个蛤到我)
  • 加载关系$task->load('task_user.user', 'task_user.status')

除了不使用belongsToMany之外,此实现没有真正的问题。