如何使用AND条件搜索数据透视表中的多个匹配项

时间:2016-12-22 10:35:13

标签: php mysql laravel pivot pivot-table

我的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解决方案指出我正确的方向

2 个答案:

答案 0 :(得分:0)

您可以使用whereIn子句查找匹配的技能名称:

$searchSkills = ['PHP', 'CSS'];

Post::whereHas('skills', function($query) use ($searchSkills){
    $query->whereIn('name', $searchSkills);
})->get();

...会返回至少有一项名为PHPCSS的技能的所有帖子。

此代码尚未经过测试。如果有效,请告诉我。

答案 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();