Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel,将两个查询合并为一个查询_Php_Laravel - Fatal编程技术网

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中的所有关系都需要添加