在laravel4中(在特定情况下),对查询生成器的paginator调用不会返回paginator对象


paginator call on query builder does not return paginator object in laravel 4 (in a specific case)

问题:

查询生成器:

$r = DB::table('someTable');
$r->where(....)
$r->paginate(30, array(....))
return $r;

现在在$r上调用get_class()会得到Illuminate'Database'Query'Builder

但打开vendor/laravel/framework/src/Illuminate/Database/Query/builder.php后,我看到了这个,

public function paginate($perPage = 15, $columns = array('*'))
{
    $paginator = $this->connection->getPaginator();

    if (isset($this->groups))
    {
        return $this->groupedPaginate($paginator, $perPage, $columns);
    }
    else
    {            
        return $this->ungroupedPaginate($paginator, $perPage, $columns);
    }
}

上面的行return $this->ungroupedPaginate($paginator, $perPage, $columns);确实返回了一个Illuminate'Pagination'Paginator对象。

但在那之后,它再次成为查询生成器对象。

然而

如果我做一个连续链,比如下面

$r = DB::table('someTable')->where(...)->orderBy(....)->paginate(....)

它返回一个分页器对象。

在以上两种情况下,调用toSql()将返回正在运行的相同sql。所以在上述两种情况下,构建器构造的是同一个查询,只返回不同的对象。

这可能是什么原因造成的?因为在我看来,在以上两种情况下产生的对象应该是相同的,即分页器。还是我错过了一些基本的东西?

您需要将返回的值重新分配给$r变量。

$r = DB::table('someTable');
$r = $r->where(....)
$r = $r->paginate(30, array(....))
return $r;