【问题标题】:How to implement search with contains using Eloquent如何使用 Eloquent 实现包含包含的搜索
【发布时间】:2020-05-21 02:52:38
【问题描述】:

我用 Eloquent 像这样创建一个搜索查询:

User::where('firstName', 'like', '%' . $search_value . '%')
      ->orWhere('lastName', 'like', '%' . $search_value . '%')
      ->get();

这是工作。但我需要使用包含进行搜索。例如,如果我的搜索值为hello world,我应该找到值为World! Okay, hello 的行。

我该怎么做?

【问题讨论】:

  • 您可以使用 Laravel 宏并创建一个宏来完全满足您的需求。结帐freek.dev/…

标签: php laravel eloquent contains


【解决方案1】:

1) 您可以使用范围方法创建搜索特征。

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 . '%');
                            }
                        }
                    });
                }
            });
        }
    }
}

2) 将Searchable 特征添加到模型和$searchable 具有可搜索列的属性。

App\Model\User.php:

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

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

【讨论】:

    【解决方案2】:

    所以最简单的方法是使用 Eloquent 宏:

    use Illuminate\Database\Eloquent\Builder;
    
    // ...
    
    Builder::macro('whereLike', function(string $attribute, string $searchTerm) {
       return $this->orWhere($attribute, 'LIKE', "%{$searchTerm}%");
    });
    

    现在您可以像这样搜索模型:

    User::query()
       ->whereLike('name', $searchTerm)
       ->whereLike('email', $searchTerm)
       ->get();
    

    关于这个主题的更多信息:https://freek.dev/1182-searching-models-using-a-where-like-query-in-laravelhttps://tighten.co/blog/the-magic-of-laravel-macros

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2010-09-19
      • 2017-08-22
      相关资源
      最近更新 更多