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

数据库查询问题。
现在项目有搜索的功能。
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();

致力于把博士生的内容说给小学生听

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
早起的虫子
最佳答案

@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()
4天前
讨论数量: 11

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

1周前

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

1周前
早起的虫子

文档

file

1周前
chihokyo

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

4天前
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会在上一个结果的基础上再次进行搜索。
看到评论留言有其他解决方法的思路,但我貌似还没写出来。

4天前
早起的虫子

@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()
4天前
chihokyo

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

放在这里面

就OK了

file

4天前
早起的虫子

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

4天前
早起的虫子

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

4天前
chihokyo

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

4天前
早起的虫子

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

4天前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!