在laravel代码库中,我正在使用这行代码:
if ($limit === '-1') {
$items = $query->get();
if ($items->count() < 1) {
return Paginator::make([], 0, Config::get('api.result_limit'));
}
return $query->paginate($items->count());
}
$ query是\Illuminate\Database\Eloquent\Relations\HasManyThrough
对象。
无论如何,问题是SELECT table_name.*
正在执行两次。 $query->get()
执行此操作然后$query->paginate
执行SELECT COUNT(*)
(由于我们已经从第一个查询中获得了计数,因此本身是多余的)和SELECT table_name.*, table_name.*
。即。它只是过分冗余,我试图消除这种冗余。
这是我尝试过的。
return $items
之后 $query->get()
。不幸的是,这样做会产生以下错误:
Call to undefined method Illuminate\Database\Eloquent\Collection::getCollection()
$ query-&gt; paginate()返回一个\MyApp\Services\Pagination\Paginator
对象,它本身扩展(\Illuminate\Pagination\Paginator
)而$ query-&gt; get()返回一个\Illuminate\Database\Eloquent\Collection
对象。
如果我能够以某种方式将\Illuminate\Database\Eloquent\Collection
转换为\Illuminate\Pagination\Paginator
,我认为这样做可以解决问题,但如果可能的话,可以这么做。
在return $query->paginate(99999999)
之后立即执行if ($limit === '-1')
。这有效,但我不想指定硬限制。在用SQL编写SELECT时我没有指定限制我写作,我也不认为我应该在这里指定一个。我试过了return $query->paginate(-1)
,但这给了一个错误。
有什么想法吗?