如何在 Laravel 中仅查找已删除的行?

3

我在项目中使用了SoftDeletes,它在数据库表中被识别为deleted_at。我想要搜索并仅找到已删除的行。

这是我的控制器代码:

 public function trashedJobSearch(Request $request)
{
    $search = $request->get('search');
    $jobs = Jobs::select('id', 'company_name', 'position_name', 'job_description','deleted_at', 'created_at', 'expire_date', 'status')
        ->where(DB::raw('lower(company_name)'), 'like', '%' . mb_strtolower($search) . '%')
        ->orWhere(DB::raw('lower(position_name)'), 'like', '%' . mb_strtolower($search) . '%')
        ->where('deleted_at', '!=', null)
        ->paginate(10);

    return view('/trashed', compact('jobs'));
}

我尝试使用 onlyTrashed(),但它也不起作用。


你能发布 $search 的值和被删除的记录吗? - TsaiKoga
4个回答

3

由于你使用了 orWhere,因此需要使用分组(grouping),并且加上 onlyTrashed

Jobs::select('id', 'company_name', 'position_name', 'job_description','deleted_at', 'created_at', 'expire_date', 'status')
  ->where(function ($query) use ($search) {
        $query->where(DB::raw('lower(company_name)'), 'like', '%' . mb_strtolower($search) . '%')
              ->orWhere(DB::raw('lower(position_name)'), 'like', '%' . mb_strtolower($search) . '%');
   })->onlyTrashed()
     ->paginate(10);

抱歉,我打错了,应该是 whereNotNull 而不是 whereNull。 - Luis Montoya
这个代码只能获取 deleted_at 为 null 的内容,但我需要获取 deleted_at 不为 null 的内容。兄弟,它不起作用。 - Rasimoghlu
这是有关文档的参考链接:https://laravel.com/docs/7.x/queries#parameter-grouping - Luis Montoya
我有3条已删除的记录,我用onlyTrashed替换了whereNotNull。但仍然无法正常工作。 - Rasimoghlu
我什么也没找到。 - Rasimoghlu
显示剩余4条评论

2
onlyTrashed()方法适用于您。有关Laravel已删除条目的文档,请参见此处。但是,我曾经看到过添加原始选择语句会出问题的情况。

去掉selectDB :: raw 中的额外部分,然后在获得所需内容之后再添加它们。从最简单的开始:

$testOfDeletedOnlyJobs = Jobs::onlyTrashed()->get();

从这里开始,添加您查询的其他部分以查看它在哪里以及为什么失败。如果上述内容没有给您任何信息,那么可能没有被删除的记录。


我只需要在搜索时获取已删除的行。我知道 onlyTrashed() 可以工作,但当我仅搜索已删除的行时它不起作用。 - Rasimoghlu
我会采用简单的方法 - 我会像上面那样拉取已删除的行,然后按集合排序。你知道onlyTrashed()是有效的,获取所有记录并使用Laravel在集合中搜索,而不是在数据库中搜索。(如果数据集不太大的话) - Watercayman
你只是缺少分组,检查一下我的答案。 - Luis Montoya
我有另一页,只收集我的已删除行。但是当我尝试在垃圾页面中搜索时,只显示未被删除的行。 - Rasimoghlu

2

你尝试过 ->where(DB::raw('deleted_at IS NOT NULL')) 吗?@Rasimoghlu - praadit

0
你可以试试这个。
在你的模型中-
use Illuminate\Database\Eloquent\SoftDeletes;

class ModelName extends Model
{
    use SoftDeletes;
}

获取仅已删除的行

$search = $request->get('search');
$data = App\ModelName::onlyTrashed()
                ->where('id', $search)
                ->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接