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

Php 如何使用和条件搜索数据透视表中的多个匹配项,php,mysql,laravel,pivot,pivot-table,Php,Mysql,Laravel,Pivot,Pivot Table,在我的laravel 5.3项目中,我有3个表,包括一个轴 工作 +----+----------------------+ | id | title | +----+----------------------+ | 1 | PHP Developer | | 2 | JavaScript Developer | | 3 | UI Developer | +----+----------------------+ +----+

在我的laravel 5.3项目中,我有3个表,包括一个轴

工作

+----+----------------------+
| id |        title         |
+----+----------------------+
| 1  | PHP Developer        |
| 2  | JavaScript Developer |
| 3  | UI Developer         |
+----+----------------------+
+----+-------+
| id | title |
+----+-------+
| 1  | PHP   |
| 2  | js    |
| 3  | CSS   |
| 4  | HTML  |
+----+-------+
技能

+----+----------------------+
| id |        title         |
+----+----------------------+
| 1  | PHP Developer        |
| 2  | JavaScript Developer |
| 3  | UI Developer         |
+----+----------------------+
+----+-------+
| id | title |
+----+-------+
| 1  | PHP   |
| 2  | js    |
| 3  | CSS   |
| 4  | HTML  |
+----+-------+
工作技能(透视表)

我在工作和技能模型中定义了归属关系。 现在,我需要匹配所有具有多种技能的工作

比如说

skills[]=php => [PHP Developer]
skills[]=js => [JavaScript Developer]
skills[]=HTML =>[PHP Developer, UI Developer]
skills[]=HTML,CSS => [UI Developer]
我试着用
whereHas
进行雄辩,但由于我必须在技能之间使用
,因此没有任何回报

$jobs = Post::whereHas('skills', function ($query) {
    foreach($skills as $skill) {
        $query->where('name', '=', $skill);
    }
})->get();

请使用雄辩或SQL解决方案为我指出正确的方向

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

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

Post::whereHas('skills', function($query) use ($searchSkills){
    $query->whereIn('name', $searchSkills);
})->get();
…将返回至少具有一种名为
PHP
CSS
的技能的所有帖子


此代码尚未经过测试。请让我知道它是否有效。

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

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

Post::whereHas('skills', function($query) use ($searchSkills){
    $query->whereIn('name', $searchSkills);
})->get();
…将返回至少具有一种名为
PHP
CSS
的技能的所有帖子


此代码尚未经过测试。请让我知道它是否有效。

一个选项是使用多个
,其中的
作为:

$query = Post::query();

foreach ($skills as $skill) {
    $query->whereHas('skills', function ($q) use($skill) {
        $q->where('name', $skill);
    });
}

$posts = $query->get();
$skill_ids = [1, 3];

假设您拥有一系列技能
id
如下:

$query = Post::query();

foreach ($skills as $skill) {
    $query->whereHas('skills', function ($q) use($skill) {
        $q->where('name', $skill);
    });
}

$posts = $query->get();
$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();

一个选项是使用多个
,其中有
作为:

$query = Post::query();

foreach ($skills as $skill) {
    $query->whereHas('skills', function ($q) use($skill) {
        $q->where('name', $skill);
    });
}

$posts = $query->get();
$skill_ids = [1, 3];

假设您拥有一系列技能
id
如下:

$query = Post::query();

foreach ($skills as $skill) {
    $query->whereHas('skills', function ($q) use($skill) {
        $q->where('name', $skill);
    });
}

$posts = $query->get();
$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();

您是否已经知道如何使用纯SQL查询实现预期结果?不,我的意思是不,仅15个字符您是否已经知道如何使用纯SQL查询实现预期结果?不,我的意思是不,仅15个字符