Level 2
it seems working using this
public function scopeFilterProgram($query, array $filters)
{
$query->when($filters['search'] ?? null, function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->where('batch_code', 'like', '%'.$search.'%')
->orWhereHas('program', function ($query) use ($search) {
$query->where('name', 'like', '%'.$search.'%');
})
->orWhere(function ($query) use ($search) {
$query->whereRaw('(SELECT MIN(start_date) FROM batches b WHERE b.batch_code = batches.batch_code) LIKE ?', ['%'.$search.'%'])
->orWhereRaw('(SELECT MAX(end_date) FROM batches b WHERE b.batch_code = batches.batch_code) LIKE ?', ['%'.$search.'%'])
->orWhereRaw('(SELECT
CASE
WHEN (SELECT status FROM batches b WHERE b.batch_code = batches.batch_code AND b.start_date = (SELECT MIN(start_date) FROM batches b2 WHERE b2.batch_code = batches.batch_code)) = "completed"
THEN
CASE
WHEN COUNT(*) > 0 THEN "running"
ELSE "upcoming"
END
ELSE
(SELECT status FROM batches b WHERE b.batch_code = batches.batch_code AND b.start_date = (SELECT MIN(start_date) FROM batches b2 WHERE b2.batch_code = batches.batch_code))
END) LIKE ?', ['%'.$search.'%']);
});
});
})->when($filters['trashed'] ?? null, function ($query, $trashed) {
if ($trashed === 'with') {
$query->withTrashed();
} elseif ($trashed === 'only') {
$query->onlyTrashed();
}
});
}