如何为查询添加分页?

How to add pagination to the query?

之前我只是简单地做一个选择一些字段和一些条件的查询。这行代码给了我正确的结果。

public function index()
{
    // Get links
    $links = Link::select('id', 'url', 'short_url', 'counter', 'expired_on')
        ->orderBy('id', 'desc')
        ->where('delete_flg', 0)
        ->get();

    // Return data
    return view('dashboard')->with(
        array(
            'links' => json_decode($links),
            'current_datetime' => Carbon::now()
        )
    );
}

现在我想对上面一行实现分页。

$links = Link::select('id', 'url', 'short_url', 'counter', 'expired_on')
    ->orderBy('id', 'desc')
    ->where('delete_flg', 0)
    ->get()->paginate(2);

当我最后尝试使用 paginate(2) 时,出现错误:

Method Illuminate\Database\Eloquent\Collection::paginate does not exist.

所以从其他一些教程我尝试不使用 ->get() 然后分页 然后我得到这样的错误。

count(): Parameter must be an array or an object that implements Countable

我对如何实现分页感到困惑。

有人可以帮我吗?

这是一个documented change in PHP 7.2。您需要将 Laravel 更新到 5.6+ 或将 PHP 降级到版本 7.1。

此外,你必须使用 paginate() 而不使用 ->get(),你还应该看看 pagination documentation.

您可以简单地执行以下操作:

$links = Link::select('id', 'url', 'short_url', 'counter', 'expired_on')
            ->orderBy('id', 'desc')
            ->where('delete_flg', 0)
            ->paginate(2);

paginate 已经像 ->get()

这就是您 return 数据/集合到您视图的方式:

// return data
return view('dashboard', compact('links'));

压缩的替代方法:

return view('dashboard')->with([
    'links' => $links
]);

然后在您看来,您可以对数据做任何您想做的事情:

@foreach($links as $link)
    <p>{{ link }}</p>
@endforeach