【问题标题】:How to use pagination() in laravel by a direct query如何通过直接查询在 laravel 中使用 pagination()
【发布时间】:2015-09-08 08:20:43
【问题描述】:

我在 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 文档的理解有什么错误?

【问题讨论】:

  • 你的桌子叫什么名字?

标签: php laravel


【解决方案1】:

通过原始查询选择将作为数组返回结果并失去对 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( ... )
);

【讨论】:

  • 我认为最好的选择是研究如何使用查询生成器。我想我以后的生活会更轻松。
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2015-07-31
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多