Транспонирование SQL-запроса в eloquent - PullRequest
0 голосов
/ 23 октября 2018

Я застрял при переносе этого 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 много хостов.Это неэффективное дублирование, которое я хочу устранить.

Конечный результат, которого я хочу, - каждый Вулн может иметь много Хостов.Если нет Хозяев, то не показывать Вульн.

1 Ответ

0 голосов
/ 23 октября 2018

Я был таким тупым.Следующее было идеально (хотя я все еще не получил это; почему это работало )

    $filter = function ($w) { 
        $w->where('country', 1)
          ->where('apptype', 'like', 'Mob%'); 
    };

    $findings1 = Vuln::with(['hosts' => $filter])
                    ->whereHas('hosts', $filter)
                    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...