Laravel 对 SELECT 语句的数学运算

问题描述

我正在处理一个查询,该查询必须从不同的表中检索一些列,并根据所需材料的数量和工作时间进行数学计算来计算产品价格。

在一张桌子上我有小时价格(价格由办公地点设置),在另一张桌子上我有材料价格(材料价格由材料类型和办公地点设置),最后我有products 表,我在其中设置了所需的总材料和工作时间。

我需要做的数学如下:

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 的模块填充一个 jquery 数据表。现在我看到所有其他列都很好,但应该显示总价的列是空的,我没有看到错误消息。我不确定 Laravel 是否允许在选择时使用这种数学运算。

如果我们使用 Laravel 5.7 可能很重要

解决方法

您需要将选择的那部分作为 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 类上,我定义了一个功能,允许我“动态”添加列以添加从表列数据生成的按钮和链接。

使用此函数,我在表格末尾添加了一个新列,其中包含数学运算的结果。

不确定是否有很多具有相同配置的项目。