热门IT资讯网

laravel cursor的底层实现

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,foreach (BillInfo::where('id', '>', 0)->orderBy('id', 'desc')->limit(10000)->cursor() as $value) {
foreach (BillInfo::where('id', '>', 0)->orderBy('id', 'desc')->limit(10000)->cursor() as $value) {
print_r($value);
}


Illuminate\Database\Query\Builder.php;
/**
* Get a generator for the given query.
*
* @return \Generator
*/
public function cursor()
{
if (is_null($this->columns)) {
$this->columns = ['*'];
}

return $this->connection->cursor(
$this->toSql(), $this->getBindings(), ! $this->useWritePdo
);
}


Illuminate\Database\Connection.php;
/**
* Run a select statement against the database and returns a generator.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return \Generator
*/
public function cursor($query, $bindings = [], $useReadPdo = true)
{
$statement = $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) {
if ($this->pretending()) {
return [];
}

// First we will create a statement for the query. Then, we will set the fetch
// mode and prepare the bindings for the query. Once that's done we will be
// ready to execute the query against the database and return the cursor.
$statement = $this->prepared($this->getPdoForSelect($useReadPdo)
->prepare($query));

$this->bindValues(
$statement, $this->prepareBindings($bindings)
);

// Next, we'll execute the query against the database and return the statement
// so we can return the cursor. The cursor will use a PHP generator to give
// back one row at a time without using a bunch of memory to render them.
$statement->execute();

return $statement;
});

while ($record = $statement->fetch()) {
yield $record;
}
}
0