Laravel 软删除:model::onlyTrashed() 返回所有

Posted

技术标签:

【中文标题】Laravel 软删除:model::onlyTrashed() 返回所有【英文标题】:Laravel soft delete: model::onlyTrashed() returns all 【发布时间】:2020-04-13 10:13:31 【问题描述】:

当我尝试在 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 个“位置”,它会完美运行。但是我显然不能使用搜索。有谁知道我如何通过搜索来实现这项工作?

谢谢。

【问题讨论】:

【参考方案1】:

通过将控制器更改为此来修复它:

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

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

【讨论】:

【参考方案2】:

在你的第一次尝试中,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”时要格外小心,因为它会弄乱您的结果并“忽略”某些条件。

您可以像这样控制括号:

$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

祝你有美好的一天!

【讨论】:

以上是关于Laravel 软删除:model::onlyTrashed() 返回所有的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询包括软删除的记录

Laravel - 软删除没有生效

Laravel 5.5 模型上的自定义软删除

Laravel 4 级联软删除

Laravel5.1 模型 --软删除

laravel如何使用软删除