$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();
2条答案
按热度按时间hujrc8aj1#
尝试访问循环中相关记录的方式可能会产生n+1问题
根据官方文件,当作为属性访问有说服力的关系时,关系数据是“延迟加载的”。这意味着在您首次访问属性之前,关系数据不会被实际加载。但是,雄辩者可以在查询父模型时“急切地加载”关系。急于加载减轻了n+1查询问题
您可以将相关数据作为
对于快速加载,只会执行2个查询来获取主模型和相关模型的数据。中的每一行
$results
将创建一个相关记录的集合,您可以迭代该集合以列出每个相关对象的详细信息。要获得相关模型的筛选行,可以修改
with()
方法as根据可以使用的相关记录获取parentmodel的筛选行
whereHas
```$results = ParentModel::with('records')
->where(...) /* If there are any filters for ParentModel */
->whereHas('records', function ($query) {
$query->where('status','=','success');
})->get();
ddarikpa2#
首先,您需要将状态保持为int形式,而不是字符串形式。它将帮助您轻松地筛选记录。
使用
chunk
用于处理大型数据集。我想是吧$ven
是为了场地。所以,遵循下面的代码。注意:我使用了查询生成器而不是雄辩。这是因为查询生成器比雄辩更快。