Laravel мягкое удаление: model :: onlyTrashed () возвращает все - PullRequest
1 голос
/ 13 апреля 2020

Когда я пытаюсь просмотреть только мягкие удаленные записи в Laravel, onlyTrashed возвращает все записи.

Как вы увидите, у меня также есть поисковая форма, которая немного усложняет. И я думаю, что поисковая форма - причина, по которой это не работает, но я не понимаю, почему именно.

Контроллер:

    public function toTrashbin(Request $request) {
        $search = '%' . $request->input('search') . '%';
        $students = Student::onlyTrashed()
            ->where('first_name', 'like', $search)
            ->orWhere('last_name', 'like', $search)
            ->orWhere('rnumber', 'like', $search)
            ->paginate(15)
            ->appends(['search'=> $request->input('search')]);
        return view('admin.students.students_trashbin')->with('students', $students);;
    }

Просмотр:

                    {{--searchform--}}
                    <form method="get" action="/students/trashbin" id="searchForm">
                        <div class="row">
                            <div class="col-sm-6 mb-2">
                                <input type="text" class="form-control" name="search" id="search"
                                       value="{{request()->search}}" placeholder="Search by name or R-number">
                            </div>
                            <div class="col-sm-2 mb-2">
                                <button type="submit" class="btn btn-success btn-block">Search</button>
                            </div>
                        </div>
                    </form>
                    <hr>

                @if (count($students) > 0)
                    {{--table--}}
                    <table class="table">
                        <thead>
                        <tr>
                            <th scope="col">Name</th>
                            <th scope="col">R-number</th>
                            <th scope="col">Deleted at</th>
                            <th scope="col">Actions</th>
                        </tr>
                        </thead>
                        <tbody>
                        @foreach ($students as $student)
                            <tr>
                                <td>{{$student->first_name}} {{$student->last_name}}</td>
                                <td>{{$student->rnumber}}</td>
                                <td>{{$student->deleted_at}}</td>
                                <td>
                                    <a href="/students/{{$student->id}}/restore">restore</a>
                                </td>
                            </tr>
                        @endforeach
                        </tbody>
                    </table>
                    {{$students->links()}} {{--pagination--}}
                @else
                    <p>No students found using your searchquery.</p>
                @endif

Каким-то образом представление отображает всех учащихся, как программно удаленных, так и не программно удаленных.

Однако: Это прекрасно работает, если я удалю 3 "где" в контроллере. Но тогда я не могу использовать поиск, очевидно. Кто-нибудь знает, как я могу сделать эту работу с поиском?

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

При первой попытке Laravel сделал что-то вроде этого:

select * from `students` where `students`.`deletedAt` is not null and `last_name` like 'test' or `last_name` like 'test';

При втором подходе запрос был смонтирован так:

select * from `students` where `students`.`deletedAt` is not null and (`last_name` like 'test' or `last_name` like 'test');

Будьте особенно осторожны, когда используя «ИЛИ» на SQL, потому что это может испортить ваши результаты и « игнорировать » некоторые условия.

Вы можете управлять своими скобками, выполняя что-то вроде этого:

$search = '%' . $request->input('search') . '%';
$query = Student::onlyTrashed();

$query->where('votes', '>', 100)
      ->orWhere(function($query) use ($search) {
           $query->where('name', $search)
                 ->where('votes', '>', 50);
        });

$query->paginate(15);

Дополнительная информация о замыканиях здесь: https://laravel.com/docs/7.x/queries#where -классы

Хорошего дня!

1 голос
/ 13 апреля 2020

Исправлено, изменив контроллер на это:

    public function toTrashbin(Request $request) {
    $search = '%' . $request->input('search') . '%';
    $conditions = [
        ['first_name', 'like', $search, 'or'],
        ['last_name', 'like', $search, 'or'],
        ['rnumber', 'like', $search, 'or'],
        ];
    $students = Student::onlyTrashed()
        ->where($conditions)
        ->paginate(15)
        ->appends(['search'=> $request->input('search')]);
    return view('admin.students.students_trashbin')->with('students', $students);;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...