Я пытаюсь создать страницу поиска, используя laravel. По сути, я хочу найти пользователей, использующих оператор OR. Я хочу найти всех пользователей, имеющих сертификацию X, Y, Z ИЛИ всех пользователей, обладающих навыками работы в сети X, Y, Z или навыком СУБД Y. Как на этом снимке экрана (http://prntscr.com/prk9pa) (Здесь я хочу найти всех пользователейкоторые имеют сертификацию BPMN ИЛИ навык SAP HANA (СУБД) и возвращают таблицу, в которой все пользователи указывают, какие критерии соответствуют. Что-то вроде:
Name | Surname | has certification | has skills
John | Smith | BPMN | no skill
Мои таблицы выглядят так:
users:
id | name | surname | and so on
1 | John | Smith | ...
certifications:
id | uid | cert_id
1 | 1 | 10
general_certs:
id | area | scope | certification (certification name)
10 | BM, I&C | Business Mng | BPMN
я имею отношение к сертификатам: пользователь один ко многим сертификатам | сертификаты один ко многим general_certs
assigned_skills:
id | skill_group_id | uid | skill_id
1 | 1 | 1 | 80
Для назначенных навыков у меня есть разные таблицы, основанные на skill_group_id
, если skill_group_id
равен 1, то будет получать данныеиз таблицы skill_dbms
, которая структурирована следующим образом:
id | db_name
1 | MySQL
...|...
80 | SAP HANA
Здесь мои отношения почти такие же, как определено для сертификаций.
Моя функция контроллера выглядит примерно так:
$search = User::join('certifications', 'users.id', '=', 'certifications.uid')
->join('assigned_skills', 'users.id', '=', 'assigned_skills.uid')
->select('users.id', 'users.name', 'users.surname', 'certifications.cert_id', 'assigned_skills.skill_id');
// has cert?
if(isset($request->certifications))
{
if(is_array($request->certifications))
{
$search->orWhereIn('certifications.cert_id', $request->certifications);
}
}
if(isset($request->dbms))
{
$search->orWhereIn('assigned_skills.skill_id', $request->dbms);
}
// return $request;
$res = $search->get();
$resDistinct = $res->unique('name', 'surname');
return $res;
Если я возвращаю $res
, я получаю дублирующиеся строки:
[
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":10,
"skill_id":3
},
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":10,
"skill_id":2
},
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":2,
"skill_id":80
},
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":55,
"skill_id":80
},
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":105,
"skill_id":80
},
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":26,
"skill_id":80
},
{
"id":1,
"name":"John",
"surname":"Smith",
"cert_id":10,
"skill_id":80
}
]
в этом случае. se $request->dbms
равно 80 (SAP HANA) и $request->certifications
равно 10. Но могут быть и массивы. И поиск производится с cert_id
и skill_id