【问题标题】:How to perform a multi table select using eloquent on Laravel如何在 Laravel 中使用 eloquent 执行多表选择
【发布时间】:2021-01-08 08:45:28
【问题描述】:

我有以下场景:

1 - 一张发票可以包含许多项目(商品或服务),每种商品或服务都以自己的价格出售。 (Invoice_items 表)。在这种情况下,如果我们想知道发票的总金额,我们可以将与之相关的项目的金额相加。

2 - 一张发票可以通过多张收据支付。因此,如果我们想知道发票是否已全部支付,我们会将每个收据项上的支付金额相加。

有关该场景的更多详细信息,请查看附图。

我想要两个雄辩的查询或其他东西,这可以帮助我:

  1. 检索所有未付款的发票。
  2. 从查询中检查是否已支付单张发票。

请考虑在我的发票模型中我有:


public function invoiceItems()
    {
        return $this->hasMany(InvoiceItem::class, 'invoices_id');
    }


 public function payments()
    {
        return $this->hasMany(Payment::class, 'invoices_id');
    }

【问题讨论】:

  • 在我的模型中,我已经为这个案例配置了所有的关系。
  • 那么您的研究遇到了什么错误?
  • 我已编辑问题以提供有关关系的更多详细信息。
  • 那么到目前为止你尝试了什么?

标签: php mysql laravel eloquent query-builder


【解决方案1】:

您可以append an attribute您的发票模型,例如:

$appends = ['is_paid'];

此属性需要一个访问器(阅读有关访问器的文档):

public function getIsPaidAttribute () {
    // here you can make the calculation and return a true/false value
}

现在,您可以在控制器中获取发票并使用invoice.is_paid 属性进行过滤。

// retrieve all invoices
// you might need to add where conditions to lighten up 
// the results if you have thousands of records
$invoices = Invoice::all();

// filter paid invoices
$paidInvoices = $invoices->filter(function($i){
     return $i->is_paid === true;
});

最后,如果您想知道发票是否已支付,只需询问$invoice->is_paid

【讨论】:

  • 好方法,好主意,实际上它现在正在以这种方式工作。但在未来的情况下,我发现可能存在内存泄漏,因为付费过滤器是通过 Eloquent Collections 制作的,即在咨询之后。我想在查询中执行它。
  • 没错,您将不得不使用 where() 而不是 Invoice::all(),并且可能使用布尔列来更轻松地进行查询过滤。您也可以使用查询生成器来执行您的查询。我认为这可能是一个很好的起点:stackoverflow.com/a/47204579/173299
猜你喜欢
  • 2017-08-22
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2019-11-19
  • 2020-09-12
  • 2018-01-08
相关资源
最近更新 更多