2016-12-22 6 views
1

У меня есть 3 таблицы, включая один стержень в моем Laravel 5,3 проектаКак найти сводную таблицу для нескольких матчей с И условия

рабочих мест

+----+----------------------+ 
| 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] 

Я попытался с whereHas в красноречив, но так как я должен использовать AND между навыками, он не возвращается ничего

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

Пожалуйста, укажите мне в правильном направлении, либо с красноречивым или SQL-решение

+0

Вы уже знаете, как достичь ожидаемого результата, используя чистые SQL-запросы? – Dragos

+1

Нет, я имею в виду не только 15 символов – laradev

+0

Привет, ты там –

ответ

0

Вы можете использовать предложение whereIn, чтобы найти подходящие имена навыков:

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

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

... вернет все сообщения с, по меньшей мере, один навык по имени PHP или CSS.

Этот код не проверял. Пожалуйста, дайте мне знать, если это сработает.

0

Одним из вариантов является использование нескольких whereHas как:

$query = Post::query(); 

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

$posts = $query->get(); 

ИЛИ

Если у вас есть массив навыков 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();