Возьмем, к примеру, следующую структуру базы данных:
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();
Если я хочу через l oop все результаты и распечатать некоторые данные я могу сделать следующее:
@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 и запрашиваю таблицу продаж , Таблица клиентов и Таблица валют?
Что теперь, если я изменю код для:
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
внутри l oop я не инициализирую новое MySQL соединение, но да, получаю прямой доступ к свойству, возвращенному Eloquent Collection?