Php 如何使用Elount实现包含搜索

Php 如何使用Elount实现包含搜索,php,laravel,eloquent,contains,Php,Laravel,Eloquent,Contains,我创建了一个搜索查询,其雄辩如下: User::where('firstName', 'like', '%' . $search_value . '%') ->orWhere('lastName', 'like', '%' . $search_value . '%') ->get(); 这是工作。但我需要搜索包含。例如,如果我的搜索值是helloworld,我应该找到值为world的行!好的,您好 我怎么做 1)您可以使用scope方法创建搜索特征 App\

我创建了一个搜索查询,其雄辩如下:

User::where('firstName', 'like', '%' . $search_value . '%')
      ->orWhere('lastName', 'like', '%' . $search_value . '%')
      ->get();
这是工作。但我需要搜索包含。例如,如果我的搜索值是
helloworld
,我应该找到值为
world的行!好的,您好

我怎么做

1)您可以使用scope方法创建搜索特征

App\Traits\Searchable.php:

namespace App\Traits;

trait Searchable
{
    public function scopeSearch($builder, $query, $columns = null)
    {
        if($query){
            $words = explode(' ', $query);
            $words = array_filter($words);

            if(!$columns){
                $columns = $this->searchable;
            }

            $builder->where(function ($builder) use ($words, $columns) {
                foreach ($words as $word) {
                    $builder->where(function ($builder) use ($word, $columns) {
                        foreach ($columns as $column) {
                            if (strpos($column, '.') !== false) {
                                [$relation, $column] = explode('.', $column);
                                $builder->orWhereHas($relation, function ($query) use ($column, $word) {
                                    $query->where($column, 'like', '%' . $word . '%');
                                });
                            } else {
                                $builder->oRwhere($this->getTable() . '.' . $column, 'like', '%' . $word . '%');
                            }
                        }
                    });
                }
            });
        }
    }
}
class User extends Authenticatable
{
    use Searchable;

    public $searchable = ['firstName', 'lastName'];
2) 将
Searchable
trait添加到模型和带有可搜索列的
$Searchable
属性

App\Model\User.php:

namespace App\Traits;

trait Searchable
{
    public function scopeSearch($builder, $query, $columns = null)
    {
        if($query){
            $words = explode(' ', $query);
            $words = array_filter($words);

            if(!$columns){
                $columns = $this->searchable;
            }

            $builder->where(function ($builder) use ($words, $columns) {
                foreach ($words as $word) {
                    $builder->where(function ($builder) use ($word, $columns) {
                        foreach ($columns as $column) {
                            if (strpos($column, '.') !== false) {
                                [$relation, $column] = explode('.', $column);
                                $builder->orWhereHas($relation, function ($query) use ($column, $word) {
                                    $query->where($column, 'like', '%' . $word . '%');
                                });
                            } else {
                                $builder->oRwhere($this->getTable() . '.' . $column, 'like', '%' . $word . '%');
                            }
                        }
                    });
                }
            });
        }
    }
}
class User extends Authenticatable
{
    use Searchable;

    public $searchable = ['firstName', 'lastName'];
3) 使用搜索范围:

$users = User::search($search_value)->get();
或具有特定列:

$users = User::search($search_value, ['firstName', 'lastName', 'role.title'])->get();
现在,您可以将此特性用于所有模型,并通过“模型”列和“模型关系”列进行搜索

第一个参数接受查询,第二个参数接受带点的列或关系列(
relation.column


我们将查询拆分为单词,并在不同的列中搜索所有匹配的单词。

因此实现这一点的最简单方法是使用雄辩的宏:

使用illumb\Database\elount\Builder;
// ...
生成器::宏('whereLike',函数(字符串$attribute,字符串$searchTerm){
返回$this->orWhere($attribute,'LIKE',“%{$searchTerm}%”);
});
现在,您可以像这样搜索模型:

User::query()
->其中,like('name',$searchTerm)
->whereLike('email',$searchTerm)
->get();
有关该主题的更多信息,请参见: 和

您可以使用Laravel宏并创建一个宏,以完全满足您的需要。结账