Php 如何使用和条件搜索数据透视表中的多个匹配项
在我的laravel 5.3项目中,我有3个表,包括一个轴 工作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 | +----+----------------------+ +----+
+----+----------------------+
| 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个字符