Разбивка на страницы в laravel с условиями

#laravel #laravel-5.8

#laravel #laravel-5.8

Вопрос:

У меня проблема с разбиением на страницы, пока я просмотрел документы, но я не могу там найти. Я также просмотрел другой пост о stack overflow, но в них нет условий, которые у меня есть в этом случае. Итак, как я могу разбить if инструкцию на страницы, потому что я получаю ошибку

Неопределенное свойство: Illuminate Разбивка на страницыLengthAwarePaginator::$threads

потому что, когда вы разбиваете на страницы, вам нужно получить это прямо из модели, вот так model::paginate() итак, как вы можете это сделать в этом случае?

контроллер

 public function index(Request $request)
{
    if($request->has('tags')){
        $tag = Tag::find($request->tags)->paginate(10);
        $threads = $tag->threads;
    } else {
        $threads = Thread::paginate(10);
    }
    return view('thread.index', compact('threads'));
}
  

итак, как вы можете правильно разбить $tag = Tag::find($request->tags)->paginate(10); это на страницы?

блейд, который генерирует ссылку, из которой контроллер получает tag , если щелкнуть по этой ссылке

 <div class="col-md-3">
<h4>Tags</h4>
<ul class="list-group">
    <a href="{{route('thread.index')}}" class="list-group-item">
        <span class="badge">14</span>
        All Threads
    </a>
    @foreach($tags as $tag)
    <a href="{{route('thread.index',['tags' => $tag->id])}}" class="list-group-item">
        <span class="badge">14</span>
        {{$tag->name}}
    </a>
    @endforeach
</ul>
  

Обновить

var_dump($request->tags); в контроллере выпадают string(1) "2"

Ответ №1:

Вы можете использовать whereHas() метод для добавления условий отношений (docs).

 if ($request->has('tags')){
    $threads = Thread::whereHas('tags', function ($query) use ($request) {
            $query->whereIn('tags.id', $request->tags);
        })->paginate(10);
} else {
    $threads = Thread::paginate(10);
}
  

В этом примере вам нужно изменить третью строку с whereIn методом в соответствии с вашими потребностями.

Комментарии:

1. Это возвращает ошибку Argument 1 passed to IlluminateDatabaseQueryBuilder::cleanBindings() must be of the type array, string given (не до конца понимаю wherein ), но я думаю, что id of tags.id в этом случае должно быть имя таблицы базы данных, но даже если я это сделаю, оно все равно вернет ошибку. Я также просмотрел это, в котором представлены документы laravel

2. Работает, когда вы меняете whereIn на where . Если это не сработает: как выглядят $request->tags данные? Не могли бы вы предоставить дамп данных.

3. Это работает, но при переходе на вторую страницу разбивки на страницы происходит ее сброс.

4. Вам нужно добавить данные к ссылкам на разбивку на страницы. На этой странице выполните поиск Appending To Pagination Links . Вам нужно сделать что-то вроде: {{ $threads->appends(['tags' => $tags])->links() }} . Но затем убедитесь, что вы отправили переменную $ tags в представление с правильным содержимым из контроллера.