Php Laravel,将两个查询合并为一个查询
我怎样才能编写出比这更好的代码:Php Laravel,将两个查询合并为一个查询,php,laravel,Php,Laravel,我怎样才能编写出比这更好的代码: $data1 = UploadsPois::where('estado_carga', Util::UPLOAD_POIS_CARGA_INGRESADA) ->where('schema_country', $schema_country) ->orderBy('id', 'asc') ->get(); foreach ($data1 as $carga) { $carga->UserResponsab
$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和一个对UploadsPois
model的调用中合并呢?
我不知道如何在同一个过程中设置
$tareas['data1']
和$tareas['data2']
。看看这段代码,我可以看出有4个重要的模型:上传Spois
,用户
,Pois
,LogPois
您可以设置关系来加载所有这些数据,而无需循环
看,
#上传POI模型
名称空间应用程序;
使用Illumb\Database\Elount\Model;
使用用户;
使用poi;
使用LogsPois;
类UploadsPois扩展模型
{
公共功能用户_responsible()
{
返回$this->belongsTo(用户::类,'responsible');
}
公共函数用户_validador()
{
返回$this->belongsTo(用户::类'validado_por');
}
公共函数pois()
{
返回$this->hasMany(Pois::class,'upload_Pois_id');
}
公共函数日志()
{
返回$this->hasMany(LogsPois::class,'upload_pois_id');
}
}
还可以按如下所示定义关系的倒数
#用户模型
名称空间应用程序;
//通常用户模型会扩展此模型,而不是基本模型。
使用Illumb\Foundation\Auth\User作为可验证的;
使用上传的SPOIS;
类用户扩展可验证的
{
公共职能部门负责人上传
{
返回$this->hasMany(UploadsPois::class,'responsible');
}
公共函数validador_上传_pois()
{
return$this->hasMany(UploadsPois::class'validado_por');
}
}
#泊松模型
名称空间应用程序;
使用Illumb\Database\Elount\Model;
使用上传的SPOIS;
类Pois扩展模型
{
公共函数上传_pois()
{
返回$this->belongsTo(UploadsPois::class,'upload_pois_id');
}
}
#对数泊松模型
名称空间应用程序;
使用Illumb\Database\Elount\Model;
使用上传的SPOIS;
类LogPois扩展模型
{
公共函数上传_pois()
{
返回$this->belongsTo(UploadsPois::class,'upload_pois_id');
}
}
现在我们已经定义了所有关系,您的$data1
变量可以如下获得:
UploadsPois::where([
['estado_carga',Util::UPLOAD_POIS_carga_INGRESADA],
['schema\u country',$schema\u country]
])
->与([
“用户负责”,
“POI”=>函数($POI){
$pois->where('pois\u validate',Util::pois\u INGRESADO);
},
'log'=>函数($log)使用($schema\u country){
$log->where('schema\u country',$schema\u country)
->whereNull('address_id'))
->orderBy('id','desc');
}
])
->订购人('id','asc')
->get();
至于$data2
:
UploadsPois::where([
['estado_carga',Util::上传POIS_carga_DEVUELTA_修订版],
['schema_country',$schema_country],
['revisado_por',auth()->id()]//与\auth::id()相同,与\auth::user()相同->id
])
->与([
“用户负责”,
“用户_validador”,
“POI”=>函数($POI){
$pois->where('pois\u validate',Util::pois\u INGRESADO)
},
'log'=>函数($log)使用($schema\u country){
$log->where('schema\u country',$schema\u country)
->whereNull('address_id'))
->orderBy('id','desc');
}
])
->订购人('id','asc')
->get();
Laravel命名约定规定您的关系方法必须在snake_情况下
关于合并这些查询。我看到的唯一区别是:
拥有$data1
等于estado_carga
而Util::UPLOAD_POIS_carga_ingreada
拥有$data2
等于estado_carga
Util::UPLOAD_POIS_carga_DEVUELTA_REVISION
有一个附加过滤器($data2
等于已验证用户的validado_por
)id
加载了一个附加关系($data2
)user\u validador
$data=UploadsPois::where('schema\u country',$schema\u country)
->与([
“用户负责”,
“用户_validador”,
“POI”=>函数($POI){
$pois->where('pois\u validate',Util::pois\u INGRESADO)
},
'log'=>函数($log)使用($schema\u country){
$log->where('schema\u country',$schema\u country)
->whereNull('address_id'))
->orderBy('id','desc');
}
])
->订购人('id','asc')
->get();
这将返回一个集合,然后可以使用多种方法对其进行筛选(where
,firstWhere
,filter
,拒绝
,等等)
#数据1
$data->where('estado_carga',Util::UPLOAD_POIS_carga_INGRESADA);
#数据2
$data->where('estado_carga',Util::UPLOAD_POIS_carga_DEVUELTA_REVISION)->where('validado_por',auth()->id());
请参见您正在
foreach()循环中执行3个附加查询。。。如果一切设置正确,$carga->UserResponable
、$carga->Pois
和$carga->Log
都可能是关系,您只需调用UploadsPois::with([“UserResponable”,“Pois”,“Log”])
并完全跳过foreach。老实说,这对于Stackoverflow来说有点太宽了。@Timliews在UploadPois
模型中我有这样一个关系:public function User(){return$this->belongsTo('App\User');}
那么我是否也应该添加一个属于tu App\User的用户负责人呢?是的;为什么不呢?你基本上是在循环中做这件事,findOrFail($carga->responsible)
,但问题是,如果这是一个关系,你可以急切地加载它以加快查询速度。谢谢你,伙计,尝试找出它来处理这些关系。Laravel中的所有关系都需要添加