以下面的数据库结构为例:
Table Sales
id | customer_id | currency_id | number | due_date
Table Open Accounts
id | sale_id | credit | debit | balance
现在说我要获得所有未结帐户:
SELECT OpenAccounts::select('oa.*')
->from('open_accounts As oa')
->join('sales AS sale', 'sale.id', '=', 'oa.sale_id')
->where('oa.balance', '>', 0)
->orderBy('sale.due_date', 'ASC')
->get();
如果要遍历所有结果并打印出一些数据,可以执行以下操作:
@foreach ($openAccounts as $open)
<tr>
<td>{{ $open->Sale->due_date }}</td>
<td>{{ $open->Sale->Customer->name }}</td>
<td>{{ sprintf('%s %s', $open->balance, $open->Sale->Currency->symbol) }}</td>
</tr>
@endforeach
问题:这意味着对于每个结果,我都打开一个MySQL连接并查询Sale表,Customer表和Currency表?
现在,如果我将代码更改为:
SELECT OpenAccounts::select('oa.*')
->with('Sale')
->with('Sale.Customer')
->with('Sale.Currency')
->from('open_accounts As oa')
->join('sales AS sale', 'sale.id', '=', 'oa.sale_id')
->where('oa.balance', '>', 0)
->orderBy('sale.due_date', 'ASC')
->get();
通过打印输出,我得到如下信息:
Illuminate\Database\Eloquent\Collection Object
(
[0] => OpenAccounts Object
(
[attributes:protected] => Array
(
[id] => 89
[sale_id] => 150
[debit] => 184.93
[credit] => 0
[balance] => 184.93
)
[relations:protected] => Array
(
[Sale] => Sales Object
(
[attributes:protected] => Array
(
[id] => 150
[customer_id] => 1
[currency_id] => 1
[number] => 5
[due_date] => '2020-03-08'
)
[relations:protected] => Array
(
[Customer] => ...
[Currency] => ...
)
)
)
)
)
问题:这是否意味着现在在$open->Sale->Customer->name
循环中使用示例时,我没有初始化新的MySQL连接,而是直接访问Eloquent Collection返回的属性?
你是对的。使用with
可使Laravel急于加载,因此将使用较少的数据库调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句