您如何从 Laravel 5.5 中的数据透视模型访问相关数据?

How do you access related data from a pivot model in Laravel 5.5?

所以我有以下关系结构:

User - UserTask - Task

我的枢轴模型 (UserTask) 需要从 Task 模型访问 属性。

所以我的 UserTask 模型中有一个访问函数,我需要在其中访问 Task->document_upload_required 属性.

有人知道我如何访问它吗?

注:

我无法在父模型中设置访问器,因为我需要使用在枢轴模型上设置的媒体功能。

我是这样定义关系的:

任务:

class Task extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'user_task')->using('App\Models\UserTask')->withPivot('completed');
    }


}

用户任务:

class UserTask extends Pivot implements HasMedia
{
    use HasMediaTrait;

    public function getCompletedAttribute()
    {
        return "Need to access parent attribute here";
    }

}

用户:

class User extends Authenticatable
{
    use HasApiTokens, Notifiable, Billable;

    public function tasks()
    {
        return $this->belongsToMany(Task::class);
    }

}

更新:

这是我试图从中获取数据的数据中心 (UserTask) table:

这是我的枢轴模型中的函数:

public function isComplete() {

        if($this->task->document_upload_required) {
            return $this->getMedia()->isEmpty() && $this->completed;
        } else {
            return $this->completed;
        }
    }


    public function getCompletedAttribute()
    {
        return $this->isComplete();
    }

以下是我打电话加入模特的方式:

 $sections = $this->model->with(['subsections.tasks.users' => function($q){
            $q->where('users.id', '=', Auth::id());
        }])->where('parent', NULL)->doesntHave('assessments')->sorted()->get();

您需要先声明关系,然后访问其 属性,如下所示:

public function task()
{
    return $this->belongsTo(Task::class);
}
public function getCompletedAttribute()
{
    return $this->task->completed;
}

编辑:

$collection = $this->model->with(['subsections.tasks.users' => function($q){
    $q->where('users.id', '=', Auth::id());
}])->where('parent', NULL)->doesntHave('assessments')->sorted()->get();

$collection->each(function($subsection) {
    $subsection->tasks->each(function($task) {
        $task->users->each(function($user) {
            dump($user->pivot->completed);
        });
    });
});
dd();