Laravel: с помощью «С» я избегаю нескольких запросов / соединений в базу данных? - PullRequest
0 голосов
/ 08 марта 2020

Возьмем, к примеру, следующую структуру базы данных:

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?

1 Ответ

0 голосов
/ 08 марта 2020

Вы правы. Использование with делает Laravel активной загрузкой, и в результате будет использоваться меньше вызовов базы данных.

См. https://laravel.com/docs/5.0/eloquent#eager -loading

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...