好吧,所以我有点狡猾和laravel(不是框架),但我在这里碰到了一堵墙 . 我需要在不同的表上执行一些条件查询,因此急切加载( ::with()
)是无用的,因为它会创建多个查询 .
好吧,让我们使用连接 . 但在这种情况下,似乎Laravel / Eloquent只是放弃了对象关系的概念而只是返回一个扁平的行 . 例如:
如果我设置类似的东西
$allInvoicesQuery = Invoice::join('contacts', 'contacts.id', '=', 'invoices.contact_id')->get();
然后循环如
foreach ($allInvoicesQuery as $oneInvoice) {
... working with fields
}
没有 $oneInvoice->invoiceFieldName
和 $oneInvoice->contact->contactFieldName
的概念了
我必须通过 $oneInvoice->contactFieldName
直接获取联系人字段 . 最重要的是,相同的命名列将被覆盖(例如 id
或 created_at
) .
所以我的问题是:
我是正确的假设没有解决方案,我必须手动定义选择中的字段,以避免相同的名称覆盖像
Invoice :: select('invoices.created_at as invoice.create,contacts.created_at as contact_create)
在多个连接的情况下,它使得所有查询构建过程冗长且复杂 . 但主要是,它只是破坏了框架应该带来的所有模型关系工作?
是否有更多的模型关系导向解决方案与laravel或Eloquent ORM一起工作?
1 回答
您可以使用Eloquent的关系来实现此目的,而不是执行此连接 .
在您的发票模型中,它将是:
然后当然在您的Contact模型中:
如果您想确保所有查询始终具有这些活动,那么您需要在模型中使用以下内容:
最后,我们的关系定义得很好,我们可以做到以下几点:
然后你可以这样做:
这是我相信你正在寻找的 .
此外,您可以在Laravel网站的The Eloquent ORM Guide找到所有这些以及更多内容 .