使用MySQL存储过程时的Laravel分页

时间:2015-12-19 07:37:01

标签: php api pagination laravel-5

这可能是一个老问题,但似乎我无法解决这个问题。我有一个Laravel 5.0 API,它调用一个从多个表中检索数据的过程。检索到大约50-80行,我想对服务的结果进行分页。

这是代码:

$infoList = DB::connection('mysql')
    ->select(DB::raw('CALL dbname.GetAllUserInfo()'));

有没有办法对此结果进行分页?即使我将数组转换为类并使用->paginate(15),它也会给我一个错误Call to undefined method stdClass::paginate()。我尝试使用foreach来创建对象,但仍然无法使用分页。有什么建议吗?我是Laravel的初学者。

1 个答案:

答案 0 :(得分:1)

你不能按照你想要的方式去做。因为$infoList->paginate(..)方法是在Eloquent Model / Builder中构建的,并且您拥有Illuminate\Database\Query\Builder实例。

DB查看外观。

有多种解决方案。您可以将$infoList数组放在集合中,并使用此slice方法。

$infoList = DB::connection('mysql')
    ->select(DB::raw('CALL dbname.GetAllUserInfo()'));

$list = collect($infoList); // or new Collection($list);
// paginate/slice the array into the set you want
// first parameter: offset, second parameter the amount/limit
$pageList = $list->slice($request->get('offset', 0), 30);

另一个解决方案是创建一个模型,不要使用存储过程(但我猜不是你需要的解决方案)。

class User extends Illuminate\Database\Eloquent\Model
{
    // model implementation
}

$infoList = User::paginate(30); // parameter: limit/size

另一个解决方案是使用存储过程并在存储过程调用中进行分页:

// stored procedure
DELIMITER //
CREATE PROCEDURE GetAllUserInfo (
    IN _limit smallint unsigned, 
    IN _offset smallint unsigned
)
BEGIN
    SELECT Name, HeadOfState FROM Country
    WHERE Continent = con
    LIMIT _offset, _limit;
END //
DELIMITER ;

// execute the stored procedure
$infoList = DB::connection('mysql')
    ->select(DB::raw('CALL dbname.GetAllUserInfo('. $request->get('offset', 0) .', 30)'));
  

注意:我写了一段存储过程已经有一段时间了,所以我写不出来了。我在脑海里写下了什么。

我希望其中一个解决方案适合您。