Как ускорить загрузку отношения belongsTo в сводной таблице?

#laravel #eager-loading

#laravel #быстрая загрузка

Вопрос:

У меня есть сводная таблица с полями, разработанными ниже.

 role_id  |   module_id  |   task_id
   1            1              1
   1            1              2
   1            1              3
 

Это мое отношение к модели для подражания.

 class Role extends Model
{
    use HasFactory;
    public function modules(){
        return $this->belongsToMany(Module::class,'role_module_tasks','role_id','module_id')
                    ->withPivot(['task_id'])
                    ->using(RoleModuleTask::class);
    }
}
 

И другое отношение belongsTo в модели RoleModuleTask (сводная таблица).

 class RoleModuleTask extends Pivot
{
    use HasFactory;
    public function task(){
       return $this->belongsTo(Task::class,'task_id');
    }
}
 

Я пытаюсь вызвать запрос, как показано ниже.

 @foreach (something()->modules as $module)
   Module:{{$module->name}} (Task:{{$module->pivot->task->name}} <br>
@endforeach
 

Затем я проверяю оператор запроса с помощью панели отладки laravel и получил более ста запросов, как показано ниже.

     select * from `tasks` where `tasks`.`id` = 1 limit 1
    select * from `tasks` where `tasks`.`id` = 2 limit 1
    select * from `tasks` where `tasks`.`id` = 3 limit 1

.... so on
 

Я хотел бы выполнить быструю загрузку для отношения belongsTo. Любые советы или рекомендации по этому поводу были бы весьма признательны, спасибо.

Ответ №1:

Вы можете использовать вложенную нетерпеливую загрузку везде, где вы инициализируете Role

 Role::with('modules.task')
 

Это приведет к быстрой загрузке как Role отношения модулей a, так и его вложенных отношений задач.

Комментарии:

1. Дорогой гайг, спасибо, но вместо этого мне нужно позвонить из pivot.