laravel 结合nicolaslopezj_searchable多表like模糊匹配

laravel 结合nicolaslopezj/searchable多表like模糊匹配

1.先听需求吧

articles表和users表,关系一对多

public function article ()
    {
        return $this->hasMany(Article::class,'user_id','id');
    }
    public function user ()
    {
        return $this->belongsTo(User::class);
    }

需求 1.like模糊查询articles下的title(文章标题),description(文章描述),body(文章内容)
2.再like查询users下面的name(用户昵称)
3.最后查询出符合两个like查询的文章内容和users信息

其实需求并不复杂,按照常规思路五步走:
1.like模糊匹配articles下的三个字段.得到文章id
2.模糊匹配user下的name字段,得到用户id
3.通过用户id查询文章id
4.merge第一步和第三步的文章ID
5.通过文章id获取文章数据,并with 用户关系

额!忘记说了,以上的所有条件还要and一个时间段查询

反正我是觉得以上的步骤真的太烦躁了,,三个字,不优雅 但是优雅的写法.我又不会🤣 🤣 🤣

我们现在来解决上的问题吧

1.安装nicolaslopezj/searchable

2.设置模型关系Articles

protected $searchable = [
        'columns' => [
            'articles.title' => 10,
            'articles.body' => 7,
            'articles.description' => 5,
            'users.name' => 4,//检索users下的name字段
        ],
        //关联关系,其实貌似用不到
        'joins' => [
            'users' => ['articles.user_id','users.id'],
        ],
    ];

3.接收时间参数

if(isset($argument['st']) && isset($argument['et']) ){
            $where = [
                ['created_at','>=',$argument['st']],
                ['created_at','<=',$argument['et']],
            ];
        }

4.设置时间段查询的对象

andWhere是我自己封装的方法

$queryBuild =  $this->article->m()->andWhere($where);

5.捕获模糊查询的值,并建立查询对象

serarch方法为这个包的方法 $argument['title']表示request接收到的值

if(isset($argument['title'])){
            /** 构建有like搜索的查询对象 */
           $queryBuild =  $this->article->m()->andWhere($where)->search($argument['title']);
        }

6.查询数据

$articles = $queryBuild
            ->select('id','user_id','title','description','is_hot','is_hidden','is_delete','created_at','updated_at')
            ->with(['user'=>function($query) use($argument){
                $query->select('id','name');
            },'category'])
            ->paginate($this->articleQuery->pageNumbers());

👇 就是见证奇迹的时刻

字段模糊报错

7.修改代码

我们限定查询articles下的created_at字段

$where = [
                ['articles.created_at','>=',$argument['st']],
                ['articles.created_at','<=',$argument['et']],
            ];

over!!! 我是觉得代码很简洁.而且修改和拓展性都很不错 🤓 🤓 🤓 🤓