Недопустимая комбинация оператора и значения при разбивке на страницы в Laravel - PullRequest
0 голосов
/ 01 ноября 2019

Я новичок в Laravel 6. В представлении я создал форму, и когда она будет отправлена, она должна вернуть таблицу, отфильтрованную с ссылками на нумерацию страниц внизу. Все работает правильно, но когда я нажимаю ссылку на пагинацию, появляется следующая ошибка: «Недопустимый оператор и комбинация значений».

Я пытался даже использовать метод «рендеринга» в представлении, но ничего не изменилось. Я вижу ссылки, но когда я нажимаю на одну из них, появляется ошибка.

Просмотр

@if (isset($meetings))
    <div class="container">
        <table class="table table-condensed table-bordered table-hover">
            <thead>
            <tr>
                <th>ID</th>
                <th>Participants</th>
                <th>Description</th>
                <th>Room</th>
                <th>Date</th>
                <th>Start Hour</th>
                <th>End Hour</th>
                <th>Edit</th>
                <th>Delete</th>
            </tr>
            </thead>
            <tbody>
                @foreach($meetings as $meeting)
                    <tr>
                        <td>{{ $meeting->id }}</td>
                        <td>{{ $meeting->id_participants }}</td>
                        <td>{{ $meeting->description }}</td>
                        <td>{{ $meeting->id_room }}</td>
                        <td>{{ $meeting->date }}</td>
                        <td>{{ $meeting->start_hour }}</td>
                        <td>{{ $meeting->end_hour }}</td>
                        <td><a href="{{ route('updateMeeting', ['id' => $meeting->id]) }}" class= "text-center"><button type="button" class="btn btn-primary">Edit</button></a></td>
                        <td>
                        <form action="{{ route('nextMeetingsDeleteMeeting', ['id' => $meeting->id]) }}" method="POST">
                        @csrf
                        {{ method_field('PUT') }}
                        <button type="submit" class="btn btn-danger" id={{ $meeting->id }}>Delete</button>
                        </form>
                        </td>

                    </tr>
                @endforeach
            </tbody>
        </table>
        <div>
            {{ $meetings->links() }}
        </div>
    </div>
@endif

Контроллер

public function fetch_table(Request $request)
{
    $this->validate($request, [
        'start_date' => 'date',
        'end_date' => 'date',
    ]);

    $start_date = $request['start_date'];
    $end_date = $request['end_date'];
    $participants = $request['participants'];
    $room_input = $request['rooms'];

    $rooms = Room::all();
    $users = User::all()->where('is_active', '1')->sortBy('surname');

    $meetings = $this->build_table($room_input, $start_date, $end_date, $participants);

    return view('reportArea', compact('users', 'rooms', 'meetings', 'start_date', 'end_date', 'participants',
        'room_input'))->withInput($request->all());
}

public function build_table($room, $start_date, $end_date, $participants)
{
    if (!empty($room) && !empty($participants)) {
        $meetings = DB::table('meetings')
            ->where('is_active', '1')
            ->where('id_room', $room)
            ->where('date', '>', $start_date)
            ->where('date', '<', $end_date)
            ->where(function ($query) use ($participants) {
                $query->where('id_participants', $participants)
                    ->orWhere('id_participants', 'like', '%;'.$participants)
                    ->orWhere('id_participants', 'like', $participants.';%')
                    ->orWhere('id_participants', 'like', '%;'.$participants.';%');
            })
            ->paginate(2);
    } elseif (!empty($participants)) {
        $meetings = DB::table('meetings')
            ->where('is_active', '1')
            ->where('date', '>', $start_date)
            ->where('date', '<', $end_date)
            ->where(function ($query) use ($participants) {
                $query->where('id_participants', $participants)
                    ->orWhere('id_participants', 'like', '%;'.$participants)
                    ->orWhere('id_participants', 'like', $participants.';%')
                    ->orWhere('id_participants', 'like', '%;'.$participants.';%');
            })
            ->paginate(2);
    } elseif (!empty($rooms)) {
        $meetings = DB::table('meetings')
            ->where('is_active', '1')
            ->where('date', '>', $start_date)
            ->where('date', '<', $end_date)
            ->where('id_room', $room)
            ->paginate(2);
    } else {
        $meetings = DB::table('meetings')
            ->where('is_active', '1')
            ->where('date', '>', $start_date)
            ->where('date', '<', $end_date)
            ->paginate(2);
    }

    return $meetings;
}

Маршрут

Route::get('/reportarea/fetchtable', 'ReportAreaController@fetch_table')->name('reportAreaFetchTable');

В настоящее время все работает нормально, но когда я нажимаю на ссылку, появляется упомянутая ошибка. Другими словами, если я добавляю метод paginate(2), я правильно вижу только две строки в таблице, но когда я нажимаю ссылку, чтобы увидеть другие, она работает неправильно. Кто-нибудь может помочь мне решить эту проблему?

1 Ответ

1 голос
/ 01 ноября 2019

Возможно, вам понадобится добавить к строке запроса, чтобы ссылки на пейджер передавали другие необходимые вам параметры. Вы передаете null в качестве значения для этих параметров запроса и получаете сообщение об ошибке.

В качестве примера:

{{ $meetings->appends(['start_date' => ..., 'end_date' => ..., ...])->links() }}

Или просто передаете все текущие параметры запроса (paginator игнорируеткакой ключ используется для текущей страницы):

{{ $meetings->appends(request()->query())->links() }}

Документы Laravel 6.x - Разбиение на страницы - Просмотр результатов - Присоединение к ссылкам на нумерацию страниц

Документы Laravel 6.x - Запросы - Получение ввода - Получение ввода из строки запроса

...