我正在使用laravel框架。在我的数据库记录表中有超过400000行。现在我想使用某种条件来检索记录 逻辑: 需要匹配服务ID 需要匹配状态
但是我的应用程序无法检索数据(无法处理此请求)。 我正在使用查询
foreach ($ven as $ven){
$data = $ven->data;
$record = $data ->records()->where('status','success')->get();
}
我的状态列已添加到索引中。
需要建议
答案 0 :(得分:0)
首先,您需要将状态保持为int形式,而不是字符串形式。这将帮助您轻松过滤记录。
并使用chunk
处理大型数据集。我想$ven
是场地。因此,请遵循以下代码。
DB::table('venues')
->select('venues.*', 'records.*')
->join('records', 'venues.id', '=', 'records.venue_id')
->orderBy('id')->chunk(1000, function($venues) {
foreach ($venues as $venue) {
// your logic
}
});
注意:我改用了查询生成器。那是因为查询生成器比雄辩的更快。
答案 1 :(得分:0)
您试图循环访问相关记录的方式可能会造成N + 1问题
As per official docs 在访问Eloquent关系作为属性时,关系数据是“延迟加载”的。这意味着直到您首次访问该属性,关系数据才被实际加载。但是,Eloquent可以在查询父模型时“急于加载”关系。提前加载可减轻N + 1查询问题
您可能希望将相关数据加载为
$results = ParentModel::with('records')
->where(...) /* If there are any filters for ParentModel */
->get();
对于急切的加载,将仅执行2个查询以获取您的主要模型和相关模型的数据。 $results
中的每一行都将包含相关记录的集合,您可以对其进行迭代以列出每个相关对象的详细信息。
要获取相关模型的过滤行,您可以将with()
方法修改为
$results = ParentModel::with(['records' => function ($query) {
$query->where('status','=','success');
}])
->where(...) /* If there are any filters for ParentModel */
->get();
要基于相关记录获取ParentModel的过滤行,可以使用whereHas
$results = ParentModel::with('records')
->where(...) /* If there are any filters for ParentModel */
->whereHas('records', function ($query) {
$query->where('status','=','success');
})->get();