Laravel分页与水合模型系列


Laravel Pagination with hydrated Model collection

我有一个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

我得到了正确的模型实例,但文档中没有显示分页的工作方式,所以我觉得还有改进的空间。