問題:
クエリビルダー:
$r = DB::table('someTable');
$r->where(....)
$r->paginate(30, array(....))
return $r;
get_class()
on$r
を呼び出すと、Illuminate\Database\Query\Builder
しかし、開いた後vendor/laravel/framework/src/Illuminate/Database/Query/builder.php
、私はこれを見ました、
public function paginate($perPage = 15, $columns = array('*'))
{
$paginator = $this->connection->getPaginator();
if (isset($this->groups))
{
return $this->groupedPaginate($paginator, $perPage, $columns);
}
else
{
return $this->ungroupedPaginate($paginator, $perPage, $columns);
}
}
上記の行は、return $this->ungroupedPaginate($paginator, $perPage, $columns);
実際にオブジェクトを返しIlluminate\Pagination\Paginator
ます。
しかしその後、再びクエリ ビルダーオブジェクトになります。
でも、
以下のように連続チェーンを行う場合
$r = DB::table('someTable')->where(...)->orderBy(....)->paginate(....)
Paginatorオブジェクトを返します。
上記の 2 つのケースの両方で、呼び出しtoSql()
は実行中の同じ sql を返します。したがって、ビルダーは、上記の 2 つのケースで異なるオブジェクトのみを返す同じクエリを構築しています。
これの原因は何ですか?私の意見では、上記の2つのケースの両方で結果として得られるオブジェクトは同じでなければならず、それはPaginatorです。または、ここで基本的なものが欠けていますか?