Laravel Pagination与水合模型系列

时间:2016-05-17 15:19:35

标签: php laravel laravel-5 pagination laravel-5.2

我有一个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()这样的方法可以正常工作。

The docs隐含提示使用array_slice,但我不知道如何处理它。如果我打电话给$models->toArray(),我可能也没有给模型加水(因为我希望尽可能多地缓存,这是一件令人讨厌的事情)。

我陪审团操纵了我在下面发布的解决方案,但我真的很想知道我是否能够分页工作,因为我会遇到这种情况。更多次,我希望尽可能多地保留视图中的逻辑,并且只是感觉有一点调整就可以使这个工作起作用。

1 个答案:

答案 0 :(得分:0)

我当前的解决方案涉及上面显示的模型和控制器设置,然后在我的视图中:

@foreach ($paginated->forPage($paginated->currentPage(), $paginated->perPage()) as $model)
    {{ $model->name }}
@endforeach

我得到了正确的模型实例,但是文档并没有表现出像这样的分页,所以我觉得还有改进的余地。