How to paginate a “has many” relationship that is ordered?

后端 未结 2 1576
无人及你
无人及你 2020-12-31 17:02

I would like to paginate the following relationship (a Category having many Apps):

class Category extends Model
{
            


        
相关标签:
2条回答
  • 2020-12-31 17:19

    To get this to work, I had to bypass the Eloquent Relationships. I created a repository instead.

    In this example, a user has lots of reports.

    App\Repositories\ReportsRepository

    This will get the reports records for a user.

    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

    Here we call the ReportsRepositroy to get the records (I've removed the Auth code).

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

    View - report/index.blade.php

    The important bit for pagination here is {!! $reports->render() !!}. This generates the links of the pagination.

    @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
    

    This is all that's needed. Laravel deals with the rest of the pagination magic itself.

    Hope this helps.

    0 讨论(0)
  • 2020-12-31 17:31

    Have you tried this?

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

    Then, on your view, you can just loop through the apps.

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

    If you want to set it as a relationship to category, you can use the setRelation method:

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

    Then in your view:

    @foreach ($category->apps as $app)
        {{ $app->id }}
    @endforeach
    
    {!! $category->apps->render() !!}
    
    0 讨论(0)
提交回复
热议问题