这可能是一个老问题,但似乎我无法解决这个问题。我有一个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的初学者。
答案 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)'));
注意:我写了一段存储过程已经有一段时间了,所以我写不出来了。我在脑海里写下了什么。
我希望其中一个解决方案适合您。