[当我尝试仅在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个“ 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);;
}
老实说,仍然不确定我的原始控制器出了什么问题,所以如果有人知道原因,请告诉我。但是,至少我可以使用它。
第一次尝试时,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上使用“ OR”时要格外小心,因为它可能使您的结果混乱,并在某些情况下“ ignore”。
您可以像这样控制小括号:
$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-clauses
祝你有美好的一天!