我得到了一个包含许多连接的查询,其中等。我需要做的是在每个结果集中插入一些数学运算,因为它将提供 csv 导出或显示在页面上。以后甚至可以作为API发回,所以我真正想做的是准备一次数据,然后在任何地方使用它。
$result = DB::table('a')
->join('b')
->where('c')
->orderBy('d')
->select('e');
if ($paginate) {
$query->paginate();
} else {
$query->get();
}
所以问题是,我能以某种方式迭代我的结果并在得到它们时做一些数学运算吗?就像每个结果的回调一样?
例如,获取每行中检索到的某些值之间的差异,或添加表示通过/失败的其他行。基本上我想知道是否有更好的方法来做事,然后对结果进行 foreach() 以浏览它们,进行数学运算并添加其他列,从而破坏分页支持并不得不将结果转换为丑陋的数组?
我能想到三种方法。例如,假设您想获取列c
和e
之间的差异。
使用原始表达式选择
使用原始表达式,您还可以使用所有可用的 SQL 函数和普通数学运算符。基本上,您可以在普通SQL选择中执行所有操作,因为Laravel会将字符串直接插入查询中。
$result = DB::table('a')
->join('b')
->where('c')
->orderBy('d')
->select('e', DB::raw('c - e AS differenceCE'));
现在,结果将具有一个包含除法结果的 differenceCE
属性。
属性访问器
这仅适用于雄辩模型!
您可以在模型中创建新的动态属性,该属性将在您访问该属性时计算
class MyModel extends Eloquent {
protected $appends = array('difference');
public function getDifferenceAttribute(){
return $this->attributes['c'] - $this->attributes['e'];
}
}
访问属性:
$mymodel->difference;
为(每个)
您还可以使用一个简单的循环,例如:
foreach($result as $model){
// do math
}
或者,如果您使用的是 Eloquent,则可以调用集合each
方法
$result->each(function($model){
// do math
});
请注意,方法 1 和 2 可能会(稍微)获得更好的性能。SQL只是因为它无论如何都必须遍历每条记录,并且带有属性访问器的方法的优点是它会延迟加载。这意味着计算仅在您使用它时发生(当您访问属性时)