Laravel soft delete:model::onlyTrashed()返回所有

Laravel soft delete:model::onlyTrashed()返回所有,laravel,view,controller,Laravel,View,Controller,当我尝试在Laravel中仅查看软删除记录时,onlyTrashed将返回所有记录 正如您将看到的,我还有一个搜索表单,它稍微简化了一些事情。我认为searchform是这不起作用的原因,但我不明白为什么 控制器: public function toTrashbin(Request $request) { $search = '%' . $request->input('search') . '%'; $students = Student::on

当我尝试在Laravel中仅查看软删除记录时,onlyTrashed将返回所有记录

正如您将看到的,我还有一个搜索表单,它稍微简化了一些事情。我认为searchform是这不起作用的原因,但我不明白为什么

控制器:

    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--}
搜寻

@如果(计数($学生)>0) {{--表--}} 名称 R数 删除于 行动 @foreach($student作为$student) {{$student->first_name}{{$student->last_name} {{$student->rnumber} {{$student->deleted_at} @endforeach {{$students->links()}{{--pagination--}} @否则 未找到使用searchquery的学生

@恩迪夫
该视图以某种方式显示所有学生,包括软删除学生和非软删除学生

但是:如果我删除控制器中的3“where”,它将非常有效。但是我显然不能使用搜索。有人知道我如何通过搜索实现这一点吗


谢谢。

通过将控制器更改为以下方式解决了此问题:

    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);;
}

老实说,我仍然不确定我原来的控制器出了什么问题,所以如果有人知道原因,请让我知道。但是,嘿,至少我成功了。

在你第一次尝试时,拉威尔做了如下事情:

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');
$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);
在第二种方法中,查询的装载方式如下:

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');
$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);
在SQL上使用“或”时要格外小心,因为它会弄乱结果并“忽略”某些条件

您可以控制括号执行以下操作:

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');
$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);
有关闭包的更多信息,请参见:

祝你有愉快的一天