我的laravel 5.3项目中有3个表,包括一个数据透视表
作业
viewHolder.title.setText(jcontent.get(i).title);
技能
+----+----------------------+
| id | title |
+----+----------------------+
| 1 | PHP Developer |
| 2 | JavaScript Developer |
| 3 | UI Developer |
+----+----------------------+
job_skill (数据透视表)
+----+-------+
| id | title |
+----+-------+
| 1 | PHP |
| 2 | js |
| 3 | CSS |
| 4 | HTML |
+----+-------+
我在作业和技能模型中定义了 belongsToMany 关系。 现在,我需要匹配所有具有多种技能的工作。
例如
+--------+----------+
| job_id | skill_id |
+--------+----------+
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
| 2 | 2 |
| 3 | 3 |
| 3 | 4 |
+--------+----------+
我试着用skills[]=php => [PHP Developer]
skills[]=js => [JavaScript Developer]
skills[]=HTML =>[PHP Developer, UI Developer]
skills[]=HTML,CSS => [UI Developer]
滔滔不绝,但由于我必须在技能之间使用whereHas
,所以它什么都不返回
AND
请使用雄辩或SQL解决方案指出我正确的方向
答案 0 :(得分:0)
您可以使用whereIn
子句查找匹配的技能名称:
$searchSkills = ['PHP', 'CSS'];
Post::whereHas('skills', function($query) use ($searchSkills){
$query->whereIn('name', $searchSkills);
})->get();
...会返回至少有一项名为PHP
或CSS
的技能的所有帖子。
此代码尚未经过测试。如果有效,请告诉我。
答案 1 :(得分:0)
一种选择是使用多个whereHas
:
$query = Post::query();
foreach ($skills as $skill) {
$query->whereHas('skills', function ($q) use($skill) {
$q->where('name', $skill);
});
}
$posts = $query->get();
OR
假设你有一系列技能id
:
$skill_ids = [1, 3];
然后你可以尝试:
Post::whereHas('skills', function($q) use($skill_ids) {
$q->whereIn('skill_id', $skill_ids)
->groupBy('post_id')
->havingRaw('COUNT(DISTINCT skill_id) = '.count($skill_ids));
})->get();