php Eloquent模型上的自定义过滤

tyg4sfes  于 11个月前  发布在  PHP
关注(0)|答案(2)|浏览(87)

我的应用程序支持使用过滤器获取数据。

Model::select($fields)->with($relations)->tap(function ($query) use ($filters) {
  // A lot of filtering logic here
  // $query->where()...... 
})->get();

字符串
然而,我想把过滤逻辑直接移到模型中,这样我就可以

Model::select($fields)
  ->with($relations)
  ->applyFilters($filters)
  ->get();


我尝试在Model中添加一个filter方法,但是在使用Builder时,它无法识别我的函数:
调用未定义的方法Illuminate\Database\Eloquent\Builder::applyFilters()
除了创建一个新的构建器类并使用它之外,还有更简单的方法吗?

e4eetjau

e4eetjau1#

我想出来了!我只需要在Model类中添加一个scopeApplyFilters

public function scopeApplyFilters($query, $filters)
{
    // Perform filtering logic with $query->where(...);

    return $query;
}

字符串
然后我可以用Model::applyFilters($filters);调用它

x4shl7ld

x4shl7ld2#

$name = isset($request->name)?trim($request->name):"";
        $email = isset($request->email)?trim($request->email):"";
        $status = isset($request->status)?$request->status:"";

         $data = User::whereIn("user_type",["Branch","User"])
         ->where(function ($query)use($email) 
         {
          if($email !=''){
            $query->where('email','Like',"%{$email}%");
          }
         })->where(function ($query)use($name) 
         {
          if($name !=''){
            $query->where('name','LIKE',"%{$name}%");
          }
         })->where(function ($query)use($status) 
         {
          if($status !=''){
            $query->where('account_status',$status);
          }
         })->paginate(20);

     
        return view('all_users')->with(["data"=>$data,"name"=>$name,"email"=>$email]);

字符串

相关问题