首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用查询生成器在Laravel中计算字段

使用查询生成器在Laravel中计算字段
EN

Stack Overflow用户
提问于 2017-03-30 15:49:06
回答 3查看 6.7K关注 0票数 3

我一直在一个Laravel项目中工作,我想知道如何在刀片视图中显示一个计算出的字段?我想从发票和总计计算字段中检索一些信息。

我想得到这个结果,但使用雄辩的ORM。查询如下:

代码语言:javascript
运行
复制
SELECT 
    invoiceheader.id, 
    invoiceheader.customerlastname,
    invoiceheader.customerfirstname, 
    invoiceheader.customernit,
    invoicedetail.productid, 
    invoicedetail.quantity,
    invoicedetail.saleprice, 
    (quantity * saleprice) as Total
FROM invoiceheader 
INNER JOIN invoicedetail
    ON invoiceheader.id = invoicedetail.invoiceid

提前谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-30 16:22:13

您可以使用laravels DB::raw(),它将字符串注入查询,如下所示:

Laravel原始表达式

代码语言:javascript
运行
复制
InvoiceHeader::select('invoiceheader.id', 'invoiceheader.customerlastname',
   'invoiceheader.customerfirstname', 'invoiceheader.customernit', 
   'invoicedetail.productid', 'invoicedetail.quantity', 
   'invoicedetail.saleprice', DB::raw('(quantity * saleprice) as Total'))
->join('invoicedetail', 'invoiceheader.id', '=', 'invoicedetail.invoiceid')
->get();

注意:确保在页面顶部导入use DB;

票数 2
EN

Stack Overflow用户

发布于 2017-03-30 17:17:47

你可以通过说出雄辩的关系和访问者来做到这一点。

在您的InvoiceHeader模型中:

代码语言:javascript
运行
复制
/*
Relation with the invoicedetail table
 */
public function detail()
{
    return $this->hasOne(InvoiceDetail::class, 'invoiceid', 'id');
}

在您的InvoiceDetail模型中:

代码语言:javascript
运行
复制
/*
The accessor field
 */
protected $appends = ['total_price'];

/*
Accessor for the total price
 */
public function getTotalPriceAttribute()
{
    return $this->quantity * $this->saleprice;
}

要从方法名称中理解创建的访问器名称,下面是laravel文档中的文本:

要定义访问器,请在模型上创建一个getFooAttribute方法,其中Foo是要访问的列的“学习”大小写名称。在本例中,我们将为first_name属性定义一个访问器。当试图检索first_name属性的值时,访问器将被雄辩者自动调用:

对于您的查询,您可以:

代码语言:javascript
运行
复制
// get all invoices in descending order of creation
$invoices = InvoiceHeader::recent()->get();

// loop invoice data to get the desired fields
foreach ($invoices as $invoice) {
    $customerfirstname = $invoice->customerfirstname;

    $totalprice = $invoice->detail->total_price;

    // more code
}

您可以在官方文档这里上阅读更多关于访问器和变异器的信息。阅读雄辩的关系这里

票数 2
EN

Stack Overflow用户

发布于 2017-03-30 16:24:35

尝尝这个

代码语言:javascript
运行
复制
InvoiceHeader::join("invoicedetail",function($query){
    $query->on("invoiceheader.id", "=", "invoicedetail.invoiceid")
})
->select("invoiceheader.id", 
         "invoiceheader.customerlastname",
         "invoiceheader.customerfirstname", 
         "invoiceheader.customernit",
         "invoicedetail.productid", 
         "invoicedetail.quantity",
         "invoicedetail.saleprice", 
\DB::raw("(invoicedetail.quantity * invoicedetail.saleprice) as Total"))
->get();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43122595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档