Метод withMax
Метод withMax применяется к запросу Eloquent
и позволяет загрузить максимальное значение указанного поля
из связанной модели. Первым параметром передаётся имя
отношения, вторым - имя поля, для которого нужно
найти максимум. Третьим необязательным параметром
можно задать псевдоним для результата.
Синтаксис
<?php
Model::withMax($relation, $column, $alias);
?>
Если псевдоним не указан, используется имя отношения
с суффиксом '_max'.
Пример
Давайте получим максимальный рейтинг комментариев для каждой статьи:
<?php
use AppModelsArticle;
$articles = Article::withMax('comments', 'rating')->get();
foreach ($articles as $article) {
echo "Article ID: " . $article->id . "\n";
echo "Max rating: " . $article->comments_max_rating . "\n\n";
}
?>
Результат выполнения кода:
"Article ID: 1"
"Max rating: 5"
""
"Article ID: 2"
"Max rating: 4"
""
"Article ID: 3"
"Max rating: 3"
В результате к каждой модели статьи будет добавлено
свойство comments_max_rating, содержащее
максимальный рейтинг комментариев.
Пример
Давайте получим максимальную цену заказов для пользователей, используя псевдоним:
<?php
use AppModelsUser;
$users = User::withMax('orders', 'price', 'max_order_price')->get();
foreach ($users as $user) {
echo "User: " . $user->name . "\n";
echo "Max order price: " . $user->max_order_price . "\n\n";
}
?>
Результат выполнения кода:
"User: John"
"Max order price: 1500"
""
"User: Mary"
"Max order price: 2000"
""
"User: Bob"
"Max order price: 800"
С помощью третьего параметра мы задали понятное
имя свойства max_order_price.
Пример
Метод withMax можно использовать вместе с
сортировкой:
<?php
use AppModelsPost;
$posts = Post::withMax('views', 'count')
->orderBy('views_max_count', 'desc')
->limit(5)
->get();
foreach ($posts as $post) {
echo $post->title . " - " . $post->views_max_count . " views\n";
}
?>
Результат выполнения кода:
"Top Post - 1000 views"
"Popular Article - 850 views"
"Trending News - 720 views"
"Featured Story - 650 views"
"Regular Update - 500 views"
Здесь мы отобрали 5 постов с наибольшим максимальным количеством просмотров за день.