我有一个Laravel 5.2应用程序,它与一个具有非常自由模式的数据库交互。我有一个特别棘手的查询,它还没有转换成Eloquent语法,相反,我们暂时只能使用hydrateRaw
:
<?php
namespace App'Models;
use Illuminate'Database'Eloquent'Model;
...
class MyModel extends Model
{
/**
* Do some crazy stuff to get a MyModel Collect
*
* @params so many
* @return Collection
*/
public static function getModels($param1, $param2, $param3, $limit)
{
return static::hydrateRaw("SELECT table1.id, table2.name, table3.date from...", [$param1, $param2, $param3, $limit]);
}
...
}
我尝试了许多不同的方法将这个集合硬塞进LengthAwarePaginator
,并取得了部分成功。
如果我在控制器中有这个:
$models = MyModel::getModels(1,2,3,1000);
$paginated = new LengthAwarePaginator($models, $models->count(), 12, 2);
并有这样的观点:
@foreach ($paginated as $model)
{{ $model->name }}
@endforech
我得到了整个集合(没有分页),尽管像currentPage()
这样的方法工作正常。
文档隐晦地暗示要使用array_slice
,但我不知道该怎么办。如果我调用$models->toArray()
,我可能还没有给模型补水(这很麻烦,因为我希望尽可能多地缓存)。
我已经在下面发布了一个解决方案,但我真的很想知道我是否可以让分页只起作用,因为我会再遇到这种情况几次,我希望尽可能多地排除视图中的逻辑,只是觉得稍微调整一下就可以让它起作用。
我当前的解决方案包括上面显示的模型和控制器设置,然后在视图中我有:
@foreach ($paginated->forPage($paginated->currentPage(), $paginated->perPage()) as $model)
{{ $model->name }}
@endforeach
我得到了正确的模型实例,但文档中没有显示分页的工作方式,所以我觉得还有改进的空间。