Laravel 下数据库模糊查询问题。

数据库查询问题。
现在项目有搜索的功能。
user表。
条件有四个,不要求必须全部四个关键字都有。
随便一个关键字也可以查询。
name。模糊搜索
code,number,ext。精确搜索。

以下方法是错误的,会把符合条件的所有都查询出来。
用的查询构造器查询的。

//连接数据库方法
public function getDB() 
{
    return \DB::connection('user');
}

public function getData()
{

    //连接数据库
    $getDB = DBService::getDB ($keywords);
    $data = $getDB->table('user')
                    ->where('name','like','%'.$keywords['name'].'%')
                    ->orWhere('code',$keywords['code'])
                    ->orWhere('number',$keywords['number'])
                    ->orWhere('ext',$keywords['ext'])
                    ->get();
    dd($data);
}

后来在网上查了一下,建议用每个关键字是否存在,然后基于上一个关键字得出的结果在进行找。
写了一下,感觉还是不对。。
不知道有没有优雅一点能解决问题的方法啊。

if (!empty($keywords['name'])) {
                $getDB->table('user')->where('name','like','%'.$keywords['name'].'%');
            }

            if (!empty($keywords['reg_number'])) {
                $getDB->table('user')->where('code',$keywords['code']);
            }

            if (!empty($keywords['reg_code'])) {
                $getDB->table('user')->where('number',$keywords['number']);
            }
            if (!empty($keywords['omit_flag'])) {
                $getDB->table('user')->where('ext',$keywords['ext']);
            }

            $data = $getDB->get();
⬇︎第一次零基础搭建的个人博客。欢迎批评指正,大力鞭策!❤︎ 旺财的个人博客(⌯¤̴̶̷̀ω¤̴̶̷́)✧ January 17th, 2020
chihokyo
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

@chihokyo
when就和你写where一样的用法,可以有很多个when,有几个判断条件就可以写几个。

$result = $query->when($keywords['name']), function($q) {
   return $q->where('name','like','%'.$keywords['name'].'%');             
})
  ->when($keywords['code']), function($q) {
    return $q->where('code',$keywords['code']);
})
->when($keywords['number']), function($q) {
   return$q->where('number',$keywords['number']);
})
->when($keywords['ext']), function($q) {
   return $q->where('ext',$keywords['ext']);
})
->get()
5年前 评论
讨论数量: 11

有的. 建议用 tucker-eric/eloquentfilter 这个拓展包,非常优雅

5年前 评论

laravel5.5 when()方法 可以试一下

5年前 评论

文档

file

5年前 评论
chihokyo

@早起的虫子
@moxiaomo
when方法可以判断多次吗。。
这个貌似需要判断四个关键字是否输入。。输入就追加一个and条件。
我在楼下写了一个能解决的写法,但估计写的不太聪明。

5年前 评论
chihokyo

虽然是一个不太聪明的方法,但是目前得出的结果是正确的写法。

//连接数据库方法
public function getDB() 
{
    return \DB::connection('user');
}

public function getData()
{

    //连接数据库
    $getDB = DBService::getDB ($keywords);
    $query = $getDB->table('user');

    if (!empty($keywords['name'])) {

        $query->where('name','like','%'.$keywords['name'].'%');             
    }

    if (!empty($keywords['code'])) {

        $query->where('code',$keywords['code']);

    }
    if (!empty($keywords['number'])) {

        $query->where('number',$keywords['number']);
    }
    if (!empty($keywords['ext'])) {

        $query->where('ext',$keywords['ext']);
    }

    $result = $query->get();

    dd($result);

}

就是$query会在上一个结果的基础上再次进行搜索。
看到评论留言有其他解决方法的思路,但我貌似还没写出来。

5年前 评论

@chihokyo
when就和你写where一样的用法,可以有很多个when,有几个判断条件就可以写几个。

$result = $query->when($keywords['name']), function($q) {
   return $q->where('name','like','%'.$keywords['name'].'%');             
})
  ->when($keywords['code']), function($q) {
    return $q->where('code',$keywords['code']);
})
->when($keywords['number']), function($q) {
   return$q->where('number',$keywords['number']);
})
->when($keywords['ext']), function($q) {
   return $q->where('ext',$keywords['ext']);
})
->get()
5年前 评论
chihokyo

@早起的虫子
你用的是什么环境啊。。我从来没出现过这种问题 就是把代码一股脑的放在这里面

放在这里面

就OK了

file

5年前 评论

@chihokyo 好吧,我可能有点问题:joy:

5年前 评论

@chihokyo 刚答案里面的闭包忘记传参数了,现在已经改了~

5年前 评论
chihokyo

@早起的虫子
弱弱的问下,这个$q是闭包参数吧?
这部分每次都看不太懂。闭包什么的。

5年前 评论

@chihokyo 对的,这个是闭包参数

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!