【发布时间】:2019-10-09 04:10:11
【问题描述】:
我怎么能写出比这个更好的代码:
$data1 = UploadsPois::where('estado_carga', Util::UPLOAD_POIS_CARGA_INGRESADA)
->where('schema_country', $schema_country)
->orderBy('id', 'asc')
->get();
foreach ($data1 as $carga) {
$carga->UserResponsable = User::findOrFail($carga->responsable);
$carga->Pois = Pois::where('upload_pois_id', $carga->id)->where('pois_validate', Util::POIS_INGRESADO)->orderBy('id', 'asc')->get();
$carga->Log = LogsPois::where('upload_pois_id', $carga->id)
->where('schema_country', $schema_country)
->whereNull('address_id')
->orderBy('id', 'desc')
->first();
}
$tareas['data1'] = $data1;
// All this bucle takes ~13000 miliseconds
$data2 = UploadsPois::where('estado_carga', Util::UPLOAD_POIS_CARGA_DEVUELTA_REVISION)
->where('schema_country', $schema_country)
->where('revisado_por', \Auth::user()->id)
->orderBy('id', 'asc')
->get();
foreach ($data2 as $carga) {
$carga->UserResponsable = User::findOrFail($carga->responsable);
$carga->UserValidador = User::findOrFail($carga->validado_por);
$carga->Pois = Pois::where('upload_pois_id', $carga->id)->where('pois_validate', Util::POIS_INGRESADO)->orderBy('id', 'asc')->get();
$carga->Log = LogsPois::where('upload_pois_id', $carga->id)
->where('schema_country', $schema_country)
->whereNull('address_id')
->orderBy('id', 'desc')
->first();
}
$tareas['data2'] = $data2;
// And this one takes ~ 20 or 50 miliseconds
那些 bucles 几乎一样,我如何合并一个 foreach 和 1 个对 UploadsPois 模型的调用?
我不确定如何在同一进程中设置$tareas['data1'] 和$tareas['data2']。
【问题讨论】:
-
您在
foreach()循环中执行了 3 个附加查询...如果您已正确设置所有内容,$carga->UserResponable、$carga->Pois和$carga->Log都可能是关系,并且您可以简单地调用UploadsPois::with(["UserResponable", "Pois", "Log"])并完全跳过 foreach。不过老实说,这对于 Stackoverflow 来说有点过于宽泛了。 -
@TimLewis In
UploadPois模型我有这个关系:public function User(){ return $this->belongsTo('App\User');}那么我是否也应该添加一个属于 tu App\User 的UserResponsable? -
是的;为什么不?您实际上是在循环中做了很长的路,
findOrFail($carga->responsable),但问题是,如果它是一个关系,您可以急切地加载它以加快查询速度。 -
试图弄清楚这些关系,谢谢伙计。
-
Laravel 中的所有关系都需要额外的参数来指定表名和列,所以在任何使用
$carga->whatever的地方,你都会在UploadsPois模型中替换为$this->whatever。$schema_country必须替换为$this->schema_country,但除此之外,它们应该没有什么奇怪的地方。