gpt4 book ai didi

php - 如何在 Laravel 查询生成器中注入(inject)自定义列

转载 作者:行者123 更新时间:2023-12-05 01:47:21 24 4
gpt4 key购买 nike

我收到一个包含许多连接、wheres 等的查询。我需要做的是在每个结果集中插入一些数学运算,因为它将提供 csv 导出或显示在页面上。稍后甚至可以作为 API 发回,所以我真正想做的是一次准备数据,然后在任何地方使用它。

$result = DB::table('a')
->join('b')
->where('c')
->orderBy('d')
->select('e');

if ($paginate) {
$query->paginate();
} else {
$query->get();
}

所以问题是,我能否以某种方式遍历我的结果并在得到它们时做一些数学运算?比如每个结果的回调?

例如,获取每行中检索到的某些值之间的差异,或者添加表示通过/失败的附加行。基本上我想知道是否有更好的做事方式,然后在结果上做一个 foreach() 来遍历它们,做数学运算并添加额外的列,从而破坏分页支持并不得不将结果转换为一个丑陋的数组?

最佳答案

我可以想到三种方法。例如,假设您想要获取列 ce 之间的差异。

用原始表达式选择

通过原始表达式,您还可以使用所有可用的 SQL 函数和普通数学运算符。基本上你可以做任何你可以在普通 SQL select 中做的事情,因为 Laravel 会将字符串直接插入到查询中。

$result = DB::table('a')
->join('b')
->where('c')
->orderBy('d')
->select('e', DB::raw('c - e AS differenceCE'));

现在结果将有一个包含除法结果的 differenceCE 属性。

属性访问器

这只适用于 Eloquent 模型!

您可以在您的模型中创建一个新的动态属性,该属性将在您访问它时计算

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 只是因为它无论如何都必须遍历每条记录,并且带有属性访问器的方法具有延迟加载的优点。这意味着计算仅在您使用它时发生(当您访问该属性时)

关于php - 如何在 Laravel 查询生成器中注入(inject)自定义列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27636858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com