SELECT 语句上的 Laravel 数学运算

Posted

技术标签:

【中文标题】SELECT 语句上的 Laravel 数学运算【英文标题】:Laravel math operations on SELECT statement 【发布时间】:2021-09-28 23:40:34 【问题描述】:

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

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

我需要做的数学如下:

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 可能很重要

【问题讨论】:

【参考方案1】:

您需要将选择的那部分作为DB::raw 语句传递

DB::raw("(products.labour * $mo[0]) + (products.premium_modifier * $mt[0]) as price")

【讨论】:

我得到了同样的结果。总价返回为空。 您可能需要仔细检查这些值。试试Log::info("(products.labour * $mo[0]) + (products.premium_modifier * $mt[0])"); 看看查询是否正确,并尝试选择那些特定的列来自己测试数学。 通常如果 Laravel 不喜欢一个查询,或者它没有正确传入,它会抛出一个错误而不是什么都不返回。 认为使用 yajra 数据表模块我必须设置一个查询(不执行它)并调用一个函数来设置视图上的表列,这可能是问题所在,因为 Laravel 不是投诉查询。【参考方案2】:

您必须使用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();

【讨论】:

【参考方案3】:

终于找到了解决办法。对于我的情况,特别是在我使用的 DataTable 类上,我定义了一个函数,允许我“动态”添加列以添加从表列数据生成的按钮和链接。

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

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

【讨论】:

以上是关于SELECT 语句上的 Laravel 数学运算的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JavaScript 传递数据以在 Laravel 中执行数学运算

MySQL之运算符大全

MySql

Laravel 如何获取数组而不是 QueryBuilder select() 语句的对象?

oracle = : := 和变量绑定 oracle通配符和运算符

如何在 Laravel 中的 SELECT 语句后插入记录时应用“ON CONFLICT”条件?