首页 > 解决方案 > 为什么当我将 get() 方法查询结果传递给 laravel 分形 Transformer 时会创建大量查询?

问题描述

嗨朋友们,我正在使用“spatie/laravel-fractal”包。

实际上我无法理解这是一个问题还是只是分形的工作方式,但是当我在另一个中包含一个分形转换器时,我会为第一个转换器的每个结果获得一个新查询。换句话说,如果我列出“Shifts”并在 with() 方法中传递“Jobs”,对于每个“Shift”,我将有一个查询来获取工作。

ShiftController(这里的方法)

public function list(Request $request)
{

    $shiftData = Shift::with(['job'])
            ->withCount('job_applications')->active()
             ->orderBy('start_date_time', 'asc')->get();

    $resource = new Collection($shiftData, new ShiftTransformer());

    $array = $this->fractal->createData($resource)->toArray();

    $array['count'] = count($array['data']);

    return $this->respondWithCode($array, Illuminate::HTTP_OK);
}

换档变压器

class ShiftTransformer extends TransformerAbstract
{

    protected $availableIncludes = [
       'roles', 'notifications', 'permissions'
     ];

   public function transform(shift $shift)
   {
      $job_sub_title = is_null($shift->job_sub_title) ? $shift->job->title : $shift->job->title . ' - ' . $shift->job_sub_title;

      return [
          'id' => (string)$shift->id,
          'title' => $job_sub_title,
      ];
   }

  }

班次表与作业表的关系

班次模型

public function job()
    {
        return $this->belongsToMany('App\Models\Job', 'job_shift', 'shift_id', 'job_id');
    }

工作模式

public function shifts()
    {
        return $this->belongsToMany('App\Models\Shift', 'job_shift');
    }

多个查询

为什么我会收到很多如下查询,因为在 Transformer 类中我没有执行任何查询

选择shifts, (select count( ) from job_applicationswhere shifts. id= job_applications. shift_idand job_applications. deleted_atis null) as job_applications_countfrom shiftswhere exists (select * from jobsinner join job_shifton jobs. id= job_shift. job_idwhere shifts. id= job_shift. shift_idand is_active= 1 and jobs. deleted_atis null) and exists (select * from jobsinner join job_shifton jobs. id= job_shift. job_idwhere shifts. id= job_shift. shift_idand 存在(select * from clientswhere jobs. client_id= clients. idand idin (6, 3) and clients. deleted_atis null)和jobs. deleted_at为空) 和 max_staffs != approved_staffs 和shifts. 按asc [] []deleted_at为空顺序start_date_time

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。在 (6, 7, 8, 9, 26, 29, 30, 31, 32, 33, 34, 35, 51, 52, 53, 54, 55, 56, 57, 64, 247, 251, 255, 256, 257、258、259、263、264、266、267、354、369、380、381、382、383、453、454、455、456、457、466、468、474、479、536、540)和 一片空白 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 64 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 31 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 32 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 35 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 57 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 53 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 34 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 56 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 54 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 55 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 33 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 52 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 251 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 266 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 264 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 267 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 257 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 258 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 255 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 256 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 263 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 259 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 354 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 382 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 383 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 380 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 369 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 455 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 456 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 51 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 247 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 381 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 466 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 468 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 479 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 474 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 26 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 30 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 29 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 9 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 454 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 457 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 453 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 536 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 540 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 7 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 6 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

选择jobs.*, job_shift. shift_idpivot_shift_id, job_shift. job_id从内部连接pivot_job_id开始。= 。哪里。= 8 和. 为空限制 1 [] []jobsjob_shiftjobsidjob_shiftjob_idjob_shiftshift_idjobsdeleted_at

标签: phpmysqllaraveleager-loading

解决方案


这可能不是正确的解决方案,但尝试在 AppServiceProvider 的启动功能中添加 Model::preventlazyloading()


推荐阅读