如何对有序的“有很多”关系进行分页?

时间:2015-11-03 19:36:56

标签: laravel laravel-5 laravel-5.1

我想分页以下关系(包含许多应用的类别):

class Category extends Model
{
    public function apps()
    {
        return $this->hasMany('App\App')->orderBy('current_price', 'asc');
    }
}

问题是,当我将->paginate(10);添加到该行的末尾时,我收到以下错误:

  

关系方法必须返回一个类型的对象   照亮\数据库\锋\关系\关系

我在这里缺少什么?

2 个答案:

答案 0 :(得分:13)

你试过这个吗?

$category = Category::first();
$apps = $category->apps()->paginate(10);
return view('example', compact('category', 'apps'));

然后,在您的视图中,您可以循环浏览应用程序。

@foreach ($apps as $app)
    {{ $app->id }}
@endforeach

{!! $apps->render() !!}

如果要将其设置为与类别的关系,可以使用setRelation方法:

$category = Category::first();
$category->setRelation('apps', $category->apps()->paginate(10));
return view('example', compact('category');

然后在你看来:

@foreach ($category->apps as $app)
    {{ $app->id }}
@endforeach

{!! $category->apps->render() !!}

答案 1 :(得分:1)

为了让这个工作,我不得不绕过雄辩的关系。我改为创建了一个存储库。

在此示例中,用户有很多报告。

应用\库\ ReportsRepository

这将获取用户的报告记录。

namespace App\Repositories;

use App\User;

class ReportsRepository
{
    public function findByUser(User $user, $paginate = 10)
    {
        $reports = User::find($user->id)
            ->reports()
            ->orderBy('created_at', 'DESC')
            ->paginate($paginate);
        return $reports;
    }
}

<强> ReportController

我们在这里调用ReportsRepositroy来获取记录(我已删除了Auth代码)。

class ReportController extends Controller
{
    public function index(\App\Repositories\ReportsRepository $repo)
    {
        $reports = $repo->findByUser(Auth::user());
        return view('report.index', ['reports' => $reports]);
    }
}

查看 - report / index.blade.php

这里分页的重要部分是 {!! $ reports-&gt; render()!!} 。这会生成分页的链接。

@extends('layout.master')

@section('content')
    <div class="content">
        <h1>Reports</h1>

        @if ($reports->count())
            <table class="table">
                <thead>
                    <tr>
                        <th>Status</th>
                        <th>Info</th>
                        <th>Date</th>
                    </tr>
                </thead>

                <tbody>
                @foreach($reports as $report)
                    <tr class="{{ $report['status'] }}">
                        <td>{{ $report['status'] }}</td>
                        <td>{{ $report['info'] }}</td>
                        <td>{{ $report['created_at'] }}</td>
                    </tr>
                @endforeach
                </tbody>
            </table>
        @else
            <p>No records exist.</p>
        @endif

        {!! $reports->render() !!}

    </div>
@stop

这就是所需要的。 Laravel处理其他的分页魔法本身。

希望这有帮助。