如何在 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 5 中使用 Eloquent 更新数据透视表
如何在 Eloquent 模型中使用 Laravel Livewire?