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

标签 php mysql laravel pivot pivot-table

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

工作

+----+----------------------+
| id |        title         |
+----+----------------------+
| 1  | PHP Developer        |
| 2  | JavaScript Developer |
| 3  | UI Developer         |
+----+----------------------+

技能

+----+-------+
| id | title |
+----+-------+
| 1  | PHP   |
| 2  | js    |
| 3  | CSS   |
| 4  | HTML  |
+----+-------+

job_skill(数据透视表)

+--------+----------+
| job_id | skill_id |
+--------+----------+
|     1  |        1 |
|     1  |        2 |
|     1  |        4 |
|     2  |        2 |
|     3  |        3 |
|     3  |        4 |
+--------+----------+

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

例如

skills[]=php => [PHP Developer]
skills[]=js => [JavaScript Developer]
skills[]=HTML =>[PHP Developer, UI Developer]
skills[]=HTML,CSS => [UI Developer]

我在 Eloquent 中尝试使用 whereHas,但由于我必须在技能之间使用 AND,所以它什么也没有返回

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

请用 Eloquent 或 SQL 解决方案为我指明正确的方向

最佳答案

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

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

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

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

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

关于php - 如何使用 AND 条件在数据透视表中搜索多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41281096/

相关文章:

php - 使用 Eloquent 选择关系计数为零的所有记录?

php - 替代 array_shift 函数

php setcookie 在 php5 下失败

mysql - 在 mysql/innodb 中拥有超过 500M varchar(255) 记录的唯一键的最佳方法?

php - 用户付款时显示字形或图像?

php - 如何在Laravel Controller 中查询ElasticSearch

php - Openssl 相当于 mcrypt_get_block_size

javascript - 在 jquery.dataTable 中同时输入两个字段

mysql - 在 WHERE 条件下划分 sql

php - Composer 安装失败 : SSL handshake timeout