Laravel如何根据字段值获取skill表中符合条件的字段名
解决Laravel动态查询skill表中值为1的布尔字段名问题
嘿,我来帮你搞定这个麻烦!不用手动列出50个技能字段,咱们用Laravel的集合和查询构建器就能轻松实现动态筛选,步骤如下:
步骤1:获取目标用户的技能记录
首先通过模型或DB门面获取user_id=1的技能记录(假设你的模型名为Skill):
使用Eloquent模型
$userSkills = Skill::where('user_id', 1)->first();
使用DB门面(如果没有创建模型)
$userSkills = DB::table('skills')->where('user_id', 1)->first();
注意:如果该用户可能有多条技能记录,把
first()换成get()后需要循环处理每条记录,不过通常一个用户对应一条技能记录,用first()就够了。
步骤2:动态筛选值为1的技能字段
把查询结果转成数组后,用Laravel集合的filter和keys方法提取符合条件的字段名,同时排除掉非技能字段(比如id、user_id、时间戳等):
基础写法(兼容PHP 7.3及以下)
if ($userSkills) { $activeSkills = collect($userSkills->toArray()) ->filter(function ($value, $key) { // 筛选值为1,且不属于非技能字段的项 return $value === 1 && !in_array($key, ['id', 'user_id', 'created_at', 'updated_at']); }) ->keys() // 提取字段名(键) ->toArray(); // 转成普通数组 } else { // 用户无技能记录时返回空数组 $activeSkills = []; }
简洁写法(PHP 7.4+支持箭头函数)
$activeSkills = $userSkills ? collect($userSkills->toArray()) ->filter(fn($v, $k) => $v === 1 && !in_array($k, ['id', 'user_id', 'created_at', 'updated_at'])) ->keys() ->all() : [];
进阶:自动识别技能字段(可选)
如果你不确定哪些是非技能字段,可以通过Laravel的Schema门面获取表结构,自动排除系统字段:
// 获取skills表的所有字段名 $allColumns = Schema::getColumnListing('skills'); // 定义需要排除的非技能字段 $excludeColumns = ['id', 'user_id', 'created_at', 'updated_at']; // 得到所有技能字段名 $skillColumns = array_diff($allColumns, $excludeColumns);
之后你可以用这个$skillColumns来辅助筛选,不过前面的方法已经足够解决问题啦。
最终效果
执行完代码后,$activeSkills就是一个包含所有值为1的技能字段名的数组,比如['skill_php', 'skill_mysql', 'skill_laravel']这样的格式。
内容的提问来源于stack exchange,提问作者Tifa Ahmed
相关产品推荐
相关产品推荐

