提问者:小点点

为什么当我将get()方法查询结果传递给laravel fractal Transformer时,它会创建大量查询?


嗨,朋友们,我正在使用“空间/拉维分形”软件包。

实际上,我无法理解这是一个问题还是分形的工作方式,但当我在另一个中包含分形变换时,我会对第一个变换的每个结果进行新的查询。换句话说,如果我列出“Shift”并在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');
    }

多重查询

为什么我得到很多查询,如下面,因为在变压器类我没有执行任何查询

选择转移.,(从job_applications转移的地方选择Count(). id=job_applications.shift_idjob_applications.deleted_at为空)as>job_applications_count转移存在的地方(选择*from作业内连接job_shifton作业. id=job_shift.job_id转移.id=job_shift.shift_idis_active=1和作业.deleted_at为空)并且存在(选择*from作业内连接job_shiftid=job_shiftjob_id其中转移id=job_shiftshift_id并且存在(从客户端中选择*>其中作业client_id=客户端idid在(6,3)和客户端中。deleted_at为空)和作业>deleted_at为空)max_staffs!=approved_staffs和移位deleted_at是null顺序由start_date_timeasc[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_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)和作业deleted_at为空[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=64和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=31和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=32和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=35和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=57和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=53和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=34和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=56和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=54和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=55和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=33和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=52和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=251和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=266和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>移位id=264和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=267和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=257和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=258和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=255和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=256和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=263和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=259和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=354和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=382和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=383和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=380和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=369和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=455和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=456和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=51和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=247和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=381和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=466和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=468和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=479和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=474和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=26和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=30和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=29和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=9和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=454和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=457和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=453和作业<代码>已删除\u在处为空限制1[]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>轮班id=536和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=540和作业deleted_at为空限制1[][]

选择作业*<代码>作业\u班次<代码>轮班id作为<代码>轴心轮班id,作业轮班<代码>作业id作为透视作业id来自作业内部联接作业移位打开作业<代码>id=作业\u班次<代码>作业id其中作业轮班<代码>班次id=7和作业<代码>已删除\u在处为空限制1[]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=6和作业deleted_at为空限制1[][]

选择作业。*,job_shiftshift_id作为pivot_shift_idjob_shiftjob_id作为pivot_job_id作业内连接job_shiftid=job_shiftjob_id其中job_shiftshift_id=8和作业deleted_at为空限制1[][]


共2个答案

匿名用户

我也面临同样的问题。以下链接可能会帮助您使用Laravel collection helper以更好的方式解决此问题。

https://laravel.com/docs/8.x/collections#method-拔

匿名用户

这可能不是合适的解决方案,但请尝试在AppServiceProvider的引导函数中添加Model::preventlazyloading()