Php 如何在Laravel查询生成器中插入自定义列

Php 如何在Laravel查询生成器中插入自定义列,php,laravel,query-builder,Php,Laravel,Query Builder,我得到一个有很多连接的查询,where,etc。我需要做的是在每个结果集中插入一些数学,因为它将提供csv导出或显示在页面上。以后甚至可以作为API发送回来,所以我真正想做的是准备数据一次,然后在任何地方使用它 $result = DB::table('a') ->join('b') ->where('c') ->orderBy('d') ->select('e'); if ($paginate) { $query->paginate(); } else

我得到一个有很多连接的查询,where,etc。我需要做的是在每个结果集中插入一些数学,因为它将提供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,则可以调用集合中的
每个
方法

$result->each(function($model){
    // do math
});

请注意,方法1和2可能会导致(稍微)更好的性能。SQL只是因为它无论如何都必须遍历每个记录,而带有属性访问器的方法具有延迟加载的优势。这意味着计算只在您使用它时发生(当您访问该属性时)

感谢您的回复,我希望得到更具动态性的东西,差异只是一个例子,我需要计算%或其他东西。不安静-确定使用db::raw有效率吗?我有点希望回调,你可以调用每个有权访问值的结果?这样的事情存在吗?我更新了我的答案。另外,您不必担心
DB::raw
它的唯一目的是编写直接插入的SQL(这样您就可以用SQL进行计算)我明白了,谢谢,这正是我目前正在做的。循环浏览结果并应用任何我想要的东西。只是我总觉得有点。。。效率低下:)我们好好想想。您需要一个“可以对每个结果调用的回调”。你认为这(内部)会起什么作用?一个循环。是的,这有点低效。SQL在性能方面会更好;)