我一直坚持将这个sql查询转换为雄辩的。我已经做了相当多的尝试,但是雄辩的结果并没有以我想要的格式返回,即:
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
- ...
我在mysql中有以下SQL提取
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
但是我坚持雄辩……这就是我所拥有的
$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具有许多主机也是如此。这是我想消除的无效重复。
我想要的最终结果是每个Vuln可以拥有许多主机。如果没有主机,则不显示Vuln。
答案 0 :(得分:0)
我真是个笨蛋。以下是完美的(尽管我仍然没有得到它,为什么它起作用了)
$filter = function ($w) {
$w->where('country', 1)
->where('apptype', 'like', 'Mob%');
};
$findings1 = Vuln::with(['hosts' => $filter])
->whereHas('hosts', $filter)
->get();