【问题标题】:How to have pagination in this context for each foreach?如何在这种情况下为每个 foreach 进行分页?
【发布时间】:2018-05-08 17:22:11
【问题描述】:

我有一个UserController,它有一个index() 方法,可以让用户用“$congresses = $user->congresses()->get();”组织所有的会议。然后在我展示的视图中,例如 DraftCongresses,即状态栏为“D”的大会,例如:

@foreach($congresses->filter(function ($item) { return $item->draftCongresses(); }) as $congress)
    <li class="list-group-item">
        <p class="font-size-xsm"><i class="fa fa-calendar" aria-hidden="true"></i>
            {{$congress->start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
        <h5 class="card-title">
            {{$congress->name}}</h5>
        <a href="{{route('congress.manage', ['id' => $congress->id])}}" class="btn btn-outline-primary font-size-sm">Panel</a>
    </li>
@endforeach

我希望对此结果进行分页,以便在草稿大会之间导航。默认情况下,我只想显示 5 个代表大会,然后我希望在其他代表大会之间进行分页导航。

我不明白如何使用 laravel paginate() 方法,因为大会是用“$congresses = $user-&gt;congresses()-&gt;get();”获得的,但是在视图中有不同的foreach,一个用于显示pastCongresses,另一个用于显示publishedCongresses 和其他显示 draftCongresses。

您知道在这种情况下如何为每个 foreach 实现分页吗?因为只有一条路由将用户组织的所有会议返回到视图,然后每个 foreach 在每个选项卡中显示必要的结果。

// 将auth用户组织的所有会议返回给视图的用户控制器

class UserController extends Controller
{
    public function index(){

        $user = Auth::user();

        $congresses = $user->congresses()->get();

        return view('users.index', compact('user','registrations', 'congresses', $congresses));
    }
}

国会模式:

    class Congress extends Model
    {
        public function pastCongresses(): bool
    {
        return $this->end_date < now();
    }

    public function draftCongresses(): bool
    {
        return $this->status == 'D';
    }

    public function publishedCongresses(): bool
    {
        return $this->status == 'P';
    }
    }

到这个视图的路线:

 Route::get('/user/profile', [
        'uses' => 'UserController@index',
        'as'   =>'user.index'
    ]);

// 具有显示过去的Congresses、draftCongresses 和已发布的Congresses 的选项卡的视图。

<div class="tab-pane clearfix fade" id="myCongresses" role="tabpanel" aria-labelledby="contact-tab">
    <div class="d-flex mb-3">
        <ul class="nav nav-pills">
            <li class="nav-item">
                <a class="nav-link active border" href="#draftCongresses" data-toggle="tab"
                   role="tab">Draft congresses</a>
            </li>
            <li class="nav-item">
                <a class="nav-link border" href="#publishedCongresses" data-toggle="tab"
                   role="tab">Published</a>
            </li>
            <li class="nav-item">
                <a class="nav-link border" href="#pastCongresses" data-toggle="tab"
                   role="tab">Past Congresses</a>
            </li>
        </ul>
    </div>

    <div class="tab-content bg-white" id="myTabContent">
        <div class="tab-pane fade active show clearfix" id="draftCongresses" role="tabpanel"
             aria-labelledby="home-tab">
            <ul class="list-group">
                @foreach($congresses->filter(function ($item) { return $item->draftCongresses(); }) as $congress)
                    <li class="list-group-item">
                        <p class="font-size-xsm"><i class="fa fa-calendar" aria-hidden="true"></i>
                            {{$congress->start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
                        <h5 class="card-title">
                            {{$congress->name}}</h5>
                        <a href="{{route('congress.manage', ['id' => $congress->id])}}" class="btn btn-outline-primary font-size-sm">Panel</a>
                    </li>
                @endforeach
            </ul>
            <!-- Pagination div static for now-->
            <div class="text-center mt-3">
                <div class="col">
                    <nav aria-label="...">
                        <ul class="pagination d-flex justify-content-center">
                            <li class="page-item disabled">
                                <span class="page-link">Previous</span>
                            </li>
                            <li class="page-item"><a class="page-link" href="#">1</a></li>
                            <li class="page-item active">
                                <span class="page-link">2</span>
                                  <span class="sr-only">(current)</span>
                            </li>
                            <li class="page-item"><a class="page-link" href="#">3</a></li>
                            <li class="page-item">
                                <a class="page-link" href="#">Next</a>
                            </li>
                        </ul>
                    </nav>
                </div>
            </div>
        </div>

        <div class="tab-pane fade show clearfix" id="publishedCongresses" role="tabpanel"
             aria-labelledby="home-tab">
            <ul class="list-group">
                @foreach($congresses->filter(function ($item) { return $item->publishedCongresses(); }) as $congress)

                    <li class="list-group-item">
                        <p class="font-size-xsm"><i class="fa fa-calendar" aria-hidden="true"></i>
                            {{$congress->start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
                        <h5 class="card-title">
                            {{$congress->name}}</h5>
                        <a href="{{route('congress.manage', ['id' => $congress->id])}}" class="btn btn-outline-primary font-size-sm">Panel</a>
                    </li>
                @endforeach
            </ul>

            <!-- Pagination div static for now-->

            <div class="text-center mt-3">
                <div class="col">
                    <nav aria-label="...">
                        <ul class="pagination d-flex justify-content-center">
                            <li class="page-item disabled">
                                <span class="page-link">Previous</span>
                            </li>
                            <li class="page-item"><a class="page-link" href="#">1</a></li>
                            <li class="page-item active">
                                <span class="page-link">2</span>
                                  <span class="sr-only">(current)</span>
                            </li>
                            <li class="page-item"><a class="page-link" href="#">3</a></li>
                            <li class="page-item">
                                <a class="page-link" href="#">Next</a>
                            </li>
                        </ul>
                    </nav>
                </div>
            </div>
        </div>

        <div class="tab-pane fade show clearfix" id="pastCongresses" role="tabpanel"
             aria-labelledby="home-tab">
            <ul class="list-group">
                @foreach($congresses->filter(function ($item) { return $item->pastCongresses(); }) as $congress)

                    <li class="list-group-item">
                        <p class="font-size-xsm"><i class="fa fa-calendar" aria-hidden="true"></i>
                            {{$congress->start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
                        <h5 class="card-title">
                            {{$congress->name}}</h5>
                        <a href="{{route('congress.manage', ['id' => $congress->id])}}" class="btn btn-outline-primary font-size-sm">Panel</a>
                    </li>
                @endforeach
            </ul>

            <!-- Pagination div static for now-->

            <div class="text-center mt-3">
                <div class="col">
                    <nav aria-label="...">
                        <ul class="pagination d-flex justify-content-center">
                            <li class="page-item disabled">
                                <span class="page-link">Previous</span>
                            </li>
                            <li class="page-item"><a class="page-link" href="#">1</a></li>
                            <li class="page-item active">
                                <span class="page-link">2</span>
                                  <span class="sr-only">(current)</span>
                            </li>
                            <li class="page-item"><a class="page-link" href="#">3</a></li>
                            <li class="page-item">
                                <a class="page-link" href="#">Next</a>
                            </li>
                        </ul>
                    </nav>
                </div>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    首先,如果您想使用分页更改,请查询
    从此:

    $congresses = $user->congresses()->get();
    

    进入这个:

    $congresses = $user->congresses()->paginate(PAGE_SIZE);
    

    阅读关于分页的简要文档here。

    其次,在视图内部对分页结果应用另一个过滤器不是一个好主意;这违反了 MVC 设计模式,您不能将其视为最佳实践。

    你可以在你的控制器中应用它并将结果传递给你的视图:

    $draftCongresses = $user->congresses()->where('status', 'D')->paginate(PAGE_SIZE)
    

    现在您可以在foreach 循环中使用$draftCongress 并访问$draftCongress-&gt;links()。

    【讨论】:

    • 谢谢,但是你知道如何使用“ //$pastCongresses = $user->congresses()->where('end_date', paginate( 5);?"
    • 你能说明视图应该如何保持吗?完成最佳实践?只是使用“@foreach($draftCongresses as $draftCongress)”吗?
    【解决方案2】:

    您必须将其设置为三个单独的查询。此外,将逻辑检查放在模型方法中有点尴尬。我认为查询范围可能更适合您。尝试像这样设置您的模型:

    class Congress extends Model
    {
        public function scopePastCongresses($query)
        {
            return $query->where('end_date', '<' now());
        }
    
        public function scopeDraftCongresses($query)
        {
            return $query->where('status', 'D');
        }
    
        public function scopePublishedCongresses($query)
        {
            return $query->where('status', 'P');
        }
    }
    

    接下来是你的控制器:

    class UserController extends Controller
    {
        protected $defaultPageLimit = 5;
    
        public function index(Illuminate\Http\Request $request)
        {
            $pageLimit = $request->input('page_limit', $this->defaultPageLimit);
    
            $user = $request->user();
            $congresses = $user->congresses();
            $past = $congresses->past()->paginate($pageLimit);
            $draft = $congresses->draft()->paginate($pageLimit);
            $published = $congresses->published()->paginate($pageLimit);
    
            $congresses = compact('past', 'draft', 'published');
    
            return view('users.index', compact('user', 'registrations', 'congresses'));
        }
    }
    

    最后是你的观点:

    @foreach($congresses['draft'] as $congress)
        <li class="list-group-item">
            <p class="font-size-xsm"><i class="fa fa-calendar" aria-hidden="true"></i>
                {{$congress->start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
            <h5 class="card-title">
                {{$congress->name}}</h5>
            <a href="{{route('congress.manage', ['id' => $congress->id])}}" class="btn btn-outline-primary font-size-sm">Panel</a>
        </li>
    @endforeach
    

    如果您的意图只是抓取 5 页的块并在之后分离出结果,您可以忽略查询范围的想法,而是像这样设置您的控制器:

    class UserController extends Controller
    {
        protected $defaultPageLimit = 5;
    
        public function index(Illuminate\Http\Request $request)
        {
            $pageLimit = $request->input('page_limit', $this->defaultPageLimit);
    
            $user = $request->user();
            $congresses = $user->congresses()->paginate($pageLimit);
            $past = $congresses->filter(function ($congress) {
                return ($congress->end_date < now());
            });
            //Note, this is NOT an SQL query-where.  The results of the query above come back as an Eloquent\Collection object, a child of Support\Collection, which itself has its own 'where()' method separate from Eloquent, that just acts like a filter.
            $draft = $congresses->where('status', 'D');
            $published = $congresses->where('status', 'P');
    
            $congresses = compact('past', 'draft', 'published');
    
            return view('users.index', compact('user', 'registrations', 'congresses'));
        }
    }
    

    【讨论】:

    • 谢谢,但是你知道如何让分页工作吗?在每次 foreach 之后使用“{{$congresses->links()}}”,它会显示“调用数组上的成员函数 links()”
    • 此时,$congresses 是一个包含三个元素的数组。每个都是不同的过滤子集,以集合的形式。你必须指定你想要的那个键,或者先合并它们。
    猜你喜欢
    • 2023-02-04
    • 2017-03-01
    • 2015-11-10
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多