Laravel 对 SELECT 语句的数学运算
Laravel math operations on SELECT statement
我正在处理一个查询,该查询必须从不同的 table 中检索一些列,并根据需要的数量 material 和工作时间。
一个table我有小时价格(价格由办公地点设定),另一个table我有material价格(材料价格设定) material 类型和办公地点)最后我得到了产品 table,我在其中设置了总 material 和所需的工作时间。
我需要做的数学运算如下:
Total price = (price per hour * total needed hours) + (price per material * total needed hours)
这是我正在处理的查询:
// working hour price
$mo = WorkForce::where('company_id', session()->get('currentCompany.id'))->orderBy('created_at', 'desc')->first()->get();
// Material price
$mt = MaterialPrice::where('company_id', session()->get('currentCompany.id'))->where('type_id', 4)->orderBy('created_at', 'desc')->first()->get();
$query = $model->newQuery()
->leftJoin('materials', 'products.material_id', '=', 'materials.id')
->leftJoin('vehicles', 'products.vehicle_id', '=', 'vehicles.id')
->leftJoin('parts', 'products.part_id', '=', 'parts.id')
->select(
'products.id as id',
'products.name as product_name',
'parts.part_name as part_name',
'materials.public_name as material',
'vehicles.name as vehicle',
"(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price"
)
->where('products.company_owner_id', session()->get('currentCompany.id'))
->orWhere('products.company_owner_id', null);
此查询是为了使用 Yajra\DataTables\EloquentDataTable
的模块 poblate jquery 数据table。现在我看到所有其他列都很好,但应该显示总价的列是空的,我没有看到错误消息。不过,我不确定 Laravel 是否允许对选择进行这种数学运算。
如果我们与 Laravel 5.7
合作可能很重要
您需要将 select 的那部分作为 DB::raw
语句传递
DB::raw("(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price")
您必须使用 selectRaw
方法满足您的需求:
$query = $model->newQuery()
->leftJoin('materials', 'products.material_id', '=', 'materials.id')
->leftJoin('vehicles', 'products.vehicle_id', '=', 'vehicles.id')
->leftJoin('parts', 'products.part_id', '=', 'parts.id')
->select(
'products.id as id',
'products.name as product_name',
'parts.part_name as part_name',
'materials.public_name as material',
'vehicles.name as vehicle'
)
->selectRaw("(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price")
->where('products.company_owner_id', session()->get('currentCompany.id'))
->orWhere('products.company_owner_id', null)
->get();
终于找到解决办法了。对于我的情况,特别是在我使用的 DataTable class 上,我定义了一个功能,允许我添加列 'on the fly' 以添加从 table 列数据生成的按钮和链接。
使用此函数,我在 table 的末尾添加了一个新列,其中包含数学运算的结果。
不确定是否有很多项目具有相同的配置。
我正在处理一个查询,该查询必须从不同的 table 中检索一些列,并根据需要的数量 material 和工作时间。
一个table我有小时价格(价格由办公地点设定),另一个table我有material价格(材料价格设定) material 类型和办公地点)最后我得到了产品 table,我在其中设置了总 material 和所需的工作时间。
我需要做的数学运算如下:
Total price = (price per hour * total needed hours) + (price per material * total needed hours)
这是我正在处理的查询:
// working hour price
$mo = WorkForce::where('company_id', session()->get('currentCompany.id'))->orderBy('created_at', 'desc')->first()->get();
// Material price
$mt = MaterialPrice::where('company_id', session()->get('currentCompany.id'))->where('type_id', 4)->orderBy('created_at', 'desc')->first()->get();
$query = $model->newQuery()
->leftJoin('materials', 'products.material_id', '=', 'materials.id')
->leftJoin('vehicles', 'products.vehicle_id', '=', 'vehicles.id')
->leftJoin('parts', 'products.part_id', '=', 'parts.id')
->select(
'products.id as id',
'products.name as product_name',
'parts.part_name as part_name',
'materials.public_name as material',
'vehicles.name as vehicle',
"(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price"
)
->where('products.company_owner_id', session()->get('currentCompany.id'))
->orWhere('products.company_owner_id', null);
此查询是为了使用 Yajra\DataTables\EloquentDataTable
的模块 poblate jquery 数据table。现在我看到所有其他列都很好,但应该显示总价的列是空的,我没有看到错误消息。不过,我不确定 Laravel 是否允许对选择进行这种数学运算。
如果我们与 Laravel 5.7
合作可能很重要您需要将 select 的那部分作为 DB::raw
语句传递
DB::raw("(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price")
您必须使用 selectRaw
方法满足您的需求:
$query = $model->newQuery()
->leftJoin('materials', 'products.material_id', '=', 'materials.id')
->leftJoin('vehicles', 'products.vehicle_id', '=', 'vehicles.id')
->leftJoin('parts', 'products.part_id', '=', 'parts.id')
->select(
'products.id as id',
'products.name as product_name',
'parts.part_name as part_name',
'materials.public_name as material',
'vehicles.name as vehicle'
)
->selectRaw("(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price")
->where('products.company_owner_id', session()->get('currentCompany.id'))
->orWhere('products.company_owner_id', null)
->get();
终于找到解决办法了。对于我的情况,特别是在我使用的 DataTable class 上,我定义了一个功能,允许我添加列 'on the fly' 以添加从 table 列数据生成的按钮和链接。
使用此函数,我在 table 的末尾添加了一个新列,其中包含数学运算的结果。
不确定是否有很多项目具有相同的配置。