You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中基于用户Skills数组的LIKE查询无结果求助

解决LIKE查询匹配数组元素无返回结果的问题

问题描述

我正在尝试用LIKE查询从Posts表中获取category字段匹配Users表skills字段中任意数组元素的结果,但目前没有返回任何数据。我的控制器代码如下:

class TaskerController extends Controller { 
    public function index() { 
        return view('index'); 
    } 
    public function tasks() { 
        $skills = Auth::user()->skills; 
        $posts = Post::where('category', 'LIKE', '%'.$skills.'%'); 
        return view('task')->with('posts', $posts); 
    } 
}

问题根源&修复方案

我一眼就发现问题所在啦:你直接把数组$skills拼进了LIKE语句里,这会让SQL变成类似WHERE category LIKE '%Array%'的无效条件,肯定查不到数据。另外,你还没执行查询(缺少get()方法),就算条件对了也拿不到结果。下面是具体的修复步骤:

1. 遍历数组构建OR条件

如果$skills是数组(比如['PHP', 'Laravel']),我们需要给每个技能单独添加LIKE匹配,并用orWhere串联这些条件:

class TaskerController extends Controller { 
    public function index() { 
        return view('index'); 
    } 
    public function tasks() { 
        $skills = Auth::user()->skills; 
        // 先初始化查询构造器
        $postsQuery = Post::query();
        
        // 遍历每个技能,添加OR模糊匹配
        foreach ($skills as $skill) {
            $postsQuery->orWhere('category', 'LIKE', "%{$skill}%");
        }
        
        // 执行查询,拿到实际结果集
        $posts = $postsQuery->get();
        
        return view('task')->with('posts', $posts); 
    } 
}

2. 额外的边界处理

  • 如果skills是存在数据库里的JSON字符串,记得先转成数组:
    $skills = json_decode(Auth::user()->skills, true);
    // 还要判断下转成数组是否成功,避免空循环
    if (!is_array($skills)) $skills = [];
    
  • 想要更安全的写法(防止SQL注入),可以用参数绑定:
    $postsQuery->orWhere('category', 'LIKE', DB::raw('CONCAT("%", ?, "%")'), [$skill]);
    

内容的提问来源于stack exchange,提问作者Noman CH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:07:28