我正在做一个搜索查询。我的要求是
员工可以搜索多种语言和语言水平的求职者
例如:
员工输入
[
['name'=>'English', 'level'=>'fluant']
]
现在我的要求是,每个求职者都要有基本的、高级的和流利的英语水平。
或者如果员工输入
[
['name'=>'English', 'level'=>'advanced']
]
然后选择所有具有英语语言能力的求职者,基本水平和高级水平。
如何在Laravel 8中编写select查询?
我正在使用这个查询
$levels = LanguageSkills::where('language_id', $lang[2])->where(function($q) {
$q->where('level', 'like', '%basic%')
->orWhere('level', 'like', '%advanced%')
->orwhere('level', 'like', '%fluent%');
})->first();
但是我对这个查询有点困惑。是否有其他的方法或可以重写这个查询与工作状态。
说到SQL,我可能会选择
SELECT first_name
FROM language_skills
WHERE language_id = < id >
AND CASE
WHEN level = 'basic' THEN 0
WHEN level = 'advanced' THEN 1
WHEN level = 'fluent' THEN 2
END >= 1;
要将其放入Laravel模型中,您可以创建雄辩的作用域和某种"LanguageSkillLevelEnum"把你的值放在一个地方
public function scopeLvlAtLeast($query, $lvl)
{
return $query->whereRaw(<<<SQL
CASE
WHEN level = 'basic' THEN 0
WHEN level = 'advanced' THEN 1
WHEN level = 'fluent' THEN 2
END >= ?
SQL, $lvl);
}
public function scopeLvlAtMost($query, $lvl)
{
return $query->whereRaw(<<<SQL
CASE
WHEN level = 'basic' THEN 0
WHEN level = 'advanced' THEN 1
WHEN level = 'fluent' THEN 2
END <= ?
SQL, $lvl);
}
(问号)用于防止SQL注入。你可以在这里阅读更多信息)
然后在你的例子中使用
$levels = LanguageSkills::where('language_id', $lang[2])->lvlAtMost(1)->first();
$levels2 = LanguageSkills::where('language_id', $lang[2])->lvlAtLeast(2)->first();