Что такое Lazy Loading и Eager Loading?


, Lazy Loading и Eager Loading? Я видел эти условия в документации, но не совсем понял, то мое-это знать, что эти термины значат, и хотел бы, если возможно, ограничить область-ответ/вопрос PHP и CakePHP (Framework, MVC, ORM встроенный), так как являются технологии, где у меня больше контакта в последнее время и где я видел условия.

Author: Leonel Sanches da Silva, 2015-07-20

2 answers

Eager Loading

Load куда все связанные классы загружаются в том же запросе. ORM, как правило, с помощью Joins, принесет всех связанных сущностей.

Пример использования

У объекта {Список[15]}, где она имеется несколько объектов Товар (one to many), в сущности {Список[15]} существует атрибут с Collection Items.

При запуске Find() или какой-либо команды, чтобы довести эти объекты все ваши отношения загружаются сразу, то есть, в вашем {Список[15]} уже будут загружены в память, все его Items (в этом примере).

Вскоре, эти объекты уже могут быть ссылки.

В некоторых случаях Eager loading становится ненужным, потому что не всегда, когда при загрузке сущности, вы хотите быть загружен в память, связанных сущностей.

Пример load Eager loading от Items по теме Списке:

// Usando em conjunto com o find()
$query = $listas->find('all', ['contain' => ['Items']]);

// Como um método query no objeto
$query = $listas->find('all');
$query->contain(['Items']);

Обратите Внимание, что могут быть установлены более отношения contain

Lazy Loading

, Как говорит само название, - это зарядка ленивый, при выполнении запросов по определенной Сущности, их отношения не загружаются в память, за первичную консультацию, однако при запуске какой-то метод, который вызывает эти записи, выполняется другой запрос, чтобы заполнить эти связанных сущностей.

Например

, Следуя примеру Списков и связанные сущности Товар, если вы используете, например, метод GetItems () {Список[15]}, ORM выполняется запрос, и тяготило эти объекты для вас.

Loads в CakePHP

Согласно документации CakePHP Lazy Loading должны быть реализованы вами, то есть, ORM не будет способ сделать это автоматика.

Пример использования

В Этом примере отношений {Список[15]} x Товар загружаются вручную в сущности {Список[15]}.

 namespace App\Model\Entity;

 use Cake\ORM\Entity;
 use Cake\ORM\TableRegistry;

class Lista extends Entity
{

    protected function _getItems()
    {
        $items = TableRegistry::get('Items');
        return $items->find('all')
            ->where(['lista_id' => $this->id])
            ->toArray();
    }

}


Документация Eager X Lazy CakePHP: http://book.cakephp.org/3.0/en/orm/entities.html#lazy-loading-associations

 20
Author: Fernando Medeiros, 2015-08-16 19:35:34

Классическим примером этого в PHP было бы дано с Laravel.

, например:

, Если у нас есть модель Пользователя, которая связана с несколькими Покупками, мы можем получить доступ к этим магазинам так

$usuarios = Usuario::all();

foreach($usuarios as $usuario)

    foreach($usuario->compras as $compra)
        echo "ID DA COMPRA é " . $compra->id

Однако, чтобы сделать это, для каждой итерации, будет сделан новый запрос в таблице покупками, чтобы соотнести с пользователем, в котором требуется информация, какие закупки он имеет.

Представьте, если у вас есть 100 пользователей в системе, и каждый связан с каким-20 покупками?

Это somaria 20.000 (двадцать тысяч) запросы выполнены!

Это в Laravel 4, было бы обойти следующим образом:

Usuario::with('compras')->all();

Таким образом, вместо 50 запросов, выполняемых, у вас будет только две запросы выполняются!

Последний пример будет такой Eager Load!

, Посмотрите на вопрос, который я задал об этом Производительность Eloquent в Laravel

 6
Author: Wallace Maxters, 2017-04-13 12:59:44