laravel 过滤器搜索名字 [space] 姓氏一起失败,个人名字或姓氏搜索有效

laravel filter to search name [space] surname together fails, individual name or surname search works

寻求帮助修复我的搜索过滤器,目前它在搜索个人姓名或姓氏时工作正常,但在搜索姓名和姓氏组合时失败(单词之间有 space)。我觉得我已经非常接近按照我的意愿让它工作了,但就是做不好。任何帮助将不胜感激。

我的模特:

public function scopeSearchFilter($query, array $filters) {
        $searchTerm = $filters[0];
        $category = $filters[1];

        $query->when($filters[0] ?? false, fn($query, $searchTerm) =>
            $query->whereHas('author', fn ($query) =>
                $query->where('name', 'like', '%' . $searchTerm . '%')
                ->orWhere('surname', 'like', '%' . $searchTerm . '%')
            )
        );
}

我的控制器(使用 livewire 顺便说一句):

    public $search;
    public $category;
   
    public function render()
    {   
        $search = $this->search;
        $category = $this->category;

        $posters = Poster::searchFilter([$this->search, $this->category])->paginate(10);
            
        return view('livewire.poster-data', [
            'posters' => $posters,
        ]);
        
    }
}

让我们以 John Doe 为例。

$searchTerm name surname
John X -
Doe - X
John Doe - -

因为您在数据库中拆分了名字和姓氏,所以您需要再次合并它或拆分您的 $searchTerm

解决这个问题的方法是使用 DB facade,以便连接姓名和姓氏,然后将其与值进行比较。 如果我是你,我会做这样的事情:

use Illuminate\Support\Facades\DB;


public function scopeSearchFilter($query, array $filters) {
        $searchTerm = $filters[0];
        $category = $filters[1];

        $query->when($filters[0] ?? false, fn($query, $searchTerm) =>
            $query->whereHas('author', fn ($query) =>
                $query->where('name', 'like', '%' . $searchTerm . '%')
                     ->orWhere('surname', 'like', '%' . $searchTerm . '%')
                     ->orWhere(DB::raw("CONCAT(`name`,' ',`surname`)"), 'like', '%' . $searchTerm . '%')
                );
            );
}