Метод loadMissing
Метод loadMissing применяется к экземпляру модели
или коллекции моделей Eloquent и позволяет загрузить
указанные отношения, но только если они ещё не были
загружены. Это помогает избежать лишних запросов к базе
данных и оптимизирует производительность приложения.
Первым параметром передаётся имя отношения или массив
отношений для загрузки, вторым - колбэк для
дополнительных условий загрузки отношения.
Синтаксис
<?php
$model->loadMissing($relations);
?>
Пример
Давайте получим модель статьи и загрузим отношение
'author' с помощью loadMissing:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$article = Article::find(1);
$article->loadMissing('author');
echo $article->author->name;
}
}
?>
Результат выполнения кода:
"John Doe"
При этом, если отношение уже было загружено ранее, повторный запрос к базе данных не выполняется.
Пример
Давайте загрузим несколько отношений одновременно
с помощью loadMissing:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$article = Article::find(1);
$article->loadMissing(['author', 'comments', 'category']);
$res = [
'author' => $article->author->name,
'comments' => $article->comments->count(),
'category' => $article->category->name
];
print_r($res);
}
}
?>
Результат выполнения кода:
Array
(
[author] => "John Doe"
[comments] => 5
[category] => "Technology"
)
Пример
Давайте загрузим вложенные отношения с помощью точечной нотации:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$article = Article::find(1);
$article->loadMissing('author.profile.socialNetworks');
$res = [
'author' => $article->author->name,
'socialNetworks' => $article->author->profile->socialNetworks
];
print_r($res);
}
}
?>
Результат выполнения кода:
Array
(
[author] => "John Doe"
[socialNetworks] => ["Twitter", "LinkedIn"]
)
Пример
Давайте применим loadMissing к коллекции моделей
и добавим дополнительное условие для загрузки:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::where('status', 'published')->get();
$articles->loadMissing([
'comments' => function ($query) {
$query->where('is_approved', true);
}
]);
foreach ($articles as $article) {
echo $article->title . " - " . $article->comments->count() . " comments\n";
}
}
}
?>
Результат выполнения кода:
"article 1 - 3 comments"
"article 2 - 1 comments"
"article 3 - 0 comments"