Po pierwsze, to możesz uprościć swoje zapytanie do:
Kopiuj
SELECT o.*
FROM orders o
WHERE o.last_status_id = 42
AND (
select count(*)
from orders_invoices oi
where oi.order_id = o.id AND oi.type_invoice_id != 5
) = 0;
Jeżeli masz warunek, że nie istnieją faktury lub nie istnieją faktury z typem różnym od 5, to ponieważ łączysz to lub, to pierwszy warunek nie jest Ci potrzebny.
Sam SQL można jeszcze zmodyfikować używająć NOT EXISTS
zamiast (SELECT ... ) = 0
Kopiuj
SELECT o.*
FROM orders o
WHERE o.last_status_id = 42
AND NOT EXISTS(
select count(*)
from orders_invoices oi
where oi.order_id = o.id AND oi.type_invoice_id != 5
);
W samym laravelu można to zapisać tak:
Kopiuj
Orders::where('last_status_id', '!=', 42)
->whereDoesntHave('orders_invoices', function ($query) {
$query->where('type_invoice_id', '!=', 5);
})
->get();