我在Laravel中使用直接查询。但我也将使用分页。我已经尝试了很多方法来使用分页功能,但总是得到一个错误。
当我阅读laravel文档时,我几乎肯定我必须这样使用它:
$blog = Db::select("SELECT *
FROM `wouter_blog_posts`
WHERE `published` IS NOT NULL
AND `published` = '1'
AND `published_at` IS NOT NULL
AND `published_at` < NOW()
AND (
SELECT count( * )
FROM `wouter_blog_tags`
INNER JOIN `wouter_blog_posts_tags` ON `wouter_blog_tags`.`id` = `wouter_blog_posts_tags`.`tags_id`
WHERE `wouter_blog_posts_tags`.`post_id` = `wouter_blog_posts`.`id`
AND `id`
IN (
'".$tagid[0]->id."'
)) >=1
ORDER BY `published_at` DESC
LIMIT 10
OFFSET 0")->paginate(5);
但是我得到这个错误:
调用数组
上的成员函数paginate()
从laravel文档中我理解错了什么?
Select by raw query将返回结果作为数组,并且失去对paginate()的访问权限。使用paginate()有两种解决方案。
(1)使用查询生成器
您需要使用查询生成器构建整个查询以访问paginate()函数。去学习如何将SQL转换为查询生成器样式。这是值得的,因为查询将独立于数据库引擎。
(2)创建自己的随意翻阅()
下面是来自类Illuminate/Database/Query/Builder (Laravel 5.0)的paginate()的源代码
/**
* Paginate the given query into a simple paginator.
*
* @param int $perPage
* @param array $columns
* @return 'Illuminate'Contracts'Pagination'LengthAwarePaginator
*/
public function paginate($perPage = 15, $columns = ['*'])
{
$page = Paginator::resolveCurrentPage();
$total = $this->getCountForPagination($columns);
$results = $this->forPage($page, $perPage)->get($columns);
return new LengthAwarePaginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
]);
}
所以你可以像这样创建你自己的paginate()
use Illuminate'Pagination'Paginator;
use Illuminate'Pagination'LengthAwarePaginator;
class YourClass {
public function paginateArray($data, $perPage = 15)
{
$page = Paginator::resolveCurrentPage();
$total = count($data);
$results = array_slice($data, ($page - 1) * $perPage, $perPage);
return new LengthAwarePaginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
]);
}
}
使用起来很方便。
$blog = $this->paginateArray(
DB::select( ... )
);