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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:13:41