Как сделать пагинацию в этом контексте для каждого foreach? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть 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->congresses()->get();", но затем в представлении есть разные foreach, один 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'
    ]);

// Просмотр, в котором есть вкладки для отображения прошлых конгрессов, черновиков конгрессов и опубликованных конгрессов.

<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>

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Сначала, если вы хотите использовать нумерацию страниц, вы запрашиваете
из этого:

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

в это:

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

Прочитайте краткую документацию о нумерации страниц здесь .

Во-вторых, не рекомендуется применять другой фильтр к результатам разбивки на страницы, особенно внутри представления; Это против шаблона проектирования MVC, и вы не можете рассматривать его как лучший опыт.

Вы можете применить его в своем контроллере и передать результат на ваш взгляд:

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

Теперь вы можете использовать $draftCongress в цикле foreach и получить доступ к $draftCongress->links().

0 голосов
/ 07 мая 2018

Вам нужно будет настроить его как три отдельных запроса. Кроме того, размещение логической проверки внутри метода модели немного неудобно. Я думаю, что объем запроса может подойти вам лучше там. Попробуйте настроить вашу модель так:

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'));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...