Метод cursor
Метод cursor применяется к запросу Eloquent или Query Builder и возвращает генератор, который позволяет итерировать по результатам запроса по одному ряду за раз. Это значительно снижает потребление памяти по сравнению с методами get или all, которые загружают все результаты в память одновременно. Метод особенно полезен при работе с большими таблицами, содержащими сотни тысяч или миллионы записей.
Синтаксис
<?php
Model::cursor();
?>
Пример
Давайте получим все статьи с помощью курсора и обработаем их по одной:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$res = Article::cursor();
foreach ($res as $article) {
echo $article->title;
}
}
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
"article 4"
"article 5"
Как видите, мы можем перебирать записи в цикле foreach, при этом каждая запись загружается в память только во время текущей итерации.
Пример
Давайте используем курсор для обновления всех статей с определённым условием:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function updateAll()
{
$res = Article::where('status', 'draft')->cursor();
foreach ($res as $article) {
$article->status = 'published';
$article->save();
echo $article->title . ' updated';
}
}
}
?>
Результат выполнения кода:
"draft article 1 updated"
"draft article 2 updated"
"draft article 3 updated"
Пример
Давайте обработаем данные с использованием агрегатных функций и условий:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function processArticles()
{
$res = Article::where('views', '>', 100)->orderBy('views', 'desc')->cursor();
foreach ($res as $article) {
echo $article->title . ': ' . $article->views . ' views';
}
}
}
?>
Результат выполнения кода:
"article 1: 1000 views"
"article 2: 500 views"
"article 3: 200 views"
Смотрите также
-
метод
get,
который выполняет запрос и возвращает коллекцию всех результатов -
метод
first,
который возвращает первую запись из результата запроса -
метод
chunk,
который обрабатывает результаты по частям заданного размера -
метод
lazy,
который возвращает ленивую коллекцию для обработки больших наборов данных