I would probably not use Eloquent for this but rather the Query builder as you do in your second example.
Another way is to use a database view and then use Eloquent on that one.
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
this is my SQL code and working OK
SELECT *
FROM vehicles AS v
WHERE v.id NOT IN(
SELECT vr.vehicle_id
FROM vehicle_rentals AS vr
JOIN vehicle_rental_times AS vrt
ON vr.vehicle_id = vrt.vehicle_id
WHERE vrt.booking_start_datetime <= "2022-06-07 15:00:00"
AND vrt.booking_end_datetime >= "2022-06-07 16:00:00")
but when I tray to translate to eloquent not working my eloquent code
$query = Vehicle::whereFleetId(Arr::get($data, 'fleet_id'))
->whereNotIn('vehicles.id', function ($subQ) use ($end_datetime, $start_datetime) {
return $subQ->select('m.vehicle_id')->from('vehicle_rentals as b')
->join('vehicle_rental_times as m', 'b.vehicle_id', '=', 'm.vehicle_id')
->where('m.booking_start_datetime', '<=', $end_datetime)
->where('m.booking_end_datetime', '>=', $start_datetime);
})->get();
second way
$query = DB::table('vehicles as r')->where('fleet_id', 3)
->whereNotIn('r.id', function ($query) {
return $query->select('m.vehicle_id')->from('vehicle_rentals as b')
->join('vehicle_rental_times as m', 'b.vehicle_id', '=', 'm.vehicle_id')
->where('m.booking_start_datetime', '=<', '2022-06-07 15:00:00')
->where('m.booking_end_datetime', '>=', '2022-06-07 16:00:00');
})->get();
the sql returns correct data it remove all vehicles cording to the time but the eloquent returns all date regardless of the date
$query->whereNotIn('vehicles.id', function ($subQ) use ($end_datetime, $start_datetime) {
return $subQ->select('vr.vehicle_id')->from('vehicle_rentals as vr')
->join('vehicle_rental_times as vrt', 'vr.vehicle_id', '=', 'vrt.vehicle_id')
->whereBetween('vrt.booking_start_datetime', [$start_datetime, $end_datetime])
->orWhereBetween('vrt.booking_start_datetime',
[$end_datetime, $start_datetime])
->orWhere(static function ($query) use ($start_datetime, $end_datetime) {
$query->where('vrt.booking_start_datetime', '<=', $start_datetime)
->where('vrt.booking_end_datetime', '>=', $end_datetime);
});
});
working solution ty
Please or to participate in this conversation.