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
相关产品推荐
相关产品推荐

