如何通过直接查询在laravel中使用pagination()


How to use pagination() in laravel by a direct query

我在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( ... )
);