首先,我要说的是,由于我正在努力弄清楚这是如何可行的,因此我只有很少的代码。
我的方案: 我有一个表单,用户可以检查他们希望搜索的技能。每种技能的简单布尔值(0或1,1当然是1)。
我需要使用此数据查询skills
表,并提取相应的个人资料,但前提是个人资料的技能列与 所选技能中的至少一个匹配。
我尝试过这样的事情:
$partners = DB::table('skills')
->when($start_up_finance, function ($query) use ($start_up_finance) {
return $query->where('start_up_finance', $start_up_finance);
})
->when($market_research, function ($query) use ($market_research) {
return $query->where('market_research', $market_research);
})
->get();
然而,when
无效我的想法。
这可以通过一个简单的where/orWhere
组合来实现吗?我只是过度思考它吗?我将使用distinct
方法确保没有重复的配置文件显示
答案 0 :(得分:2)
skills
表的理想结构是规范化的结构,其中每个用户技能都驻留在单独的记录中。像这样:
user_id | skill
1 | start_up_finance
1 | market_research
1 | accounting
2 | market_research
现在假设您想获得所有启动财务或会计技能的用户。您可以使用以下简单的MySQL查询:
SELECT DISTINCT user_id
FROM skills
WHERE skill IN ('start_up_finance', 'accounting');
这只会返回此示例中的第一个用户。我在这里使用SELECT DISTINCT
来删除只是工件的重复项。
将每个技能存储在单独的列中并不理想的原因是多方面的。但最重要的是,每次添加新技能都需要相当干扰的数据库更改。规范化问题是另一个主要问题。数据库旨在有效地使用行集进行操作,而不是真正的列。
以下是我对Laravel查询的尝试:
users = DB::table('skills')
->distinct()
->select('user_id')
->whereIn('skill', ['start_up_finance', 'accounting'])
->get();