отношение вызова в модели Pivot - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь загрузить отношения как:

 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 голосов
/ 21 мая 2019

Если бы Laravel предоставил способ проходить замыкания в опорных точках, это было бы совсем не сложно, однако на данный момент есть 2 решения для загрузки отношений опорных точек

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

Проблема: Это делает запрос для каждого пользователя, связанного с задачей.Если вы не разбиваете на страницы свои результаты, это классическая проблема N + 1.

2.Вместо этого используйте hasMany и serveTo.

  • Определение отношения $ user-> tasks_user (пользователь hasMany TaskUser)
  • Определение отношения $ task-> tasks_user (Task hasMany TaskUser)
  • Определить обратное (TaskUser относится к пользователю, TaskUser принадлежит к задаче)
  • Определить последнее отношение task_user (TaskUser hasOne TaskStatus) (хотя выглядит как мне принадлежащее)
  • Загрузить отношения $task->load('task_user.user', 'task_user.status')

Нет реальной проблемы с этой реализацией, кроме того, что не используется belongsToMany.

...