2016-05-17 147 views
2

我有一个Laravel 5.2应用程序与具有相当自由形式架构的数据库进行交互。我有一个尚未转换成雄辩语法一个特别粗糙的查询,而不是我们被卡住hydrateRaw暂且:Laravel分页与水合模型集合

<?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(),我可能还没有给模型补充水分(这是一个麻烦,因为我希望尽可能缓存)。

我有陪审团操纵了一个我在下面发布的解决方案,但我真的很想知道我是否可以分页才能正常工作,因为我要多次遇到这种情况,想要让尽可能多的逻辑摆脱观点,只是有一种感觉可以让这个工作起作用。

+0

如果我误解了你的问题,请纠正我的错误,但在视图中,你想迭代'$ paginated'对象,而不是整个'$ models'集合。然后你应该得到分页结果,并通过调用'$ models-> links()'来渲染分页控件。 –

+0

这是一个错字!我正在讨论$分页,并将整个未分类的集合作为结果。 –

+0

我使用相对简单的原始查询(从一个表中取几列并将其中两个其他表)进行测试,它对我有效,您的问题可能与您正在运行的复杂查询有关。 –

回答

0

我目前的解决方案包括上面显示的模型和控制器的设置,然后在视图中我有:

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

我得到正确的模型实例,但该文档不显示分页这样的工作,所以我觉得还有改进的空间。