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