如何在 Laravel 中使用 eloquent 执行多表选择

Posted

技术标签:

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

我有以下场景:

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

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

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

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

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

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


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


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

【问题讨论】:

你应该学习laravel.com/docs/8.x/eloquent-relationships 在我的模型中,我已经为这个案例配置了所有的关系。 那么您的研究遇到了什么错误? 我已编辑问题以提供有关关系的更多详细信息。 那么到目前为止你尝试了什么? 【参考方案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(),并且可能使用布尔列来更轻松地进行查询过滤。您也可以使用查询生成器来执行您的查询。我认为这可能是一个很好的起点:***.com/a/47204579/173299

以上是关于如何在 Laravel 中使用 eloquent 执行多表选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eloquent 在 Laravel 中开始查询?

如何在 Laravel/Eloquent 中获得完整的关系

如何在 laravel 5 中使用 Eloquent 更新数据透视表

如何在 Eloquent 模型中使用 Laravel Livewire?

如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合

如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?