Я застрял при переносе этого SQL-запроса на eloquent.Я попробовал довольно честно, но красноречивые результаты не возвращались в формате, который я хочу, а именно:
Vuln A
- Host 1
- Host 2
Vul B
- Host 3
Vul C
- Host 1
- Host 2
- Host 5
Это мои модели.
Модели (многие ко многим)
Host
- id
- apptype
- country
- ...
Vuln
- id
- severity
- ...
Host_Vuln
- id
- Host_id
- Vul_id
- Mesg
- ...
Запросы
У меня есть следующее извлечение SQL, которое в mysql
SELECT * from Vuln
INNER JOIN Host_Vuln on Host_Vuln.Vuln_id = Vuln.id
INNER JOIN Host on Host_Vuln.Host_id = Host.id
WHERE (Host.country = 1) AND (Host.apptype like 'Mob%')
ORDER BY Vuln.severity DESC
Но я застрял на Eloquent ... Это то, что у меня
$vulnResult = DB::table('vulns')
->join('host_vuln', 'vulns.id', '=', 'host_vuln.finding_id')
->join('hosts', 'host_vuln.host_id', '=', 'hosts.id')
->where('hosts.country', 1)
->where('hosts.apptype', 'like', 'Web%')
->orderBy('vulns.score', 'DESC')
->get();
где результаты были возвращены в коллекцию без вложенных хостов под Vuln.Результирующая коллекция представляет собой простой массив, в котором каждый хост сопоставлен с Vuln, даже если у Vuln много хостов.Это неэффективное дублирование, которое я хочу устранить.
Конечный результат, которого я хочу, - каждый Вулн может иметь много Хостов.Если нет Хозяев, то не показывать Вульн.