join('videos', 'clips.video_id', '=', 'videos.id') ->with(['video', 'video.transcriptions', 'video.channel']) ->select('clips.*') // Ensures only Clip attributes are returned ->orderBy('videos.external_date', 'desc'); // Filter by channel_ids if ($request->has('channel_ids')) { $query->whereHas('video', function ($q) use ($request) { $q->whereIn('channel_id', $request->input('channel_ids')); }); } // Filter by specific video_id if ($request->has('video_id')) { $query->whereHas('video', function ($q) use ($request) { $q->where('id', $request->input('video_id')); }); } // Filter by languages (via video.channel.language) if ($request->has('languages')) { $languages = $request->input('languages'); $query->whereHas('video.channel', function ($q) use ($languages) { $q->whereIn('language', $languages); }); } // Filter by external_date range if ($request->has('start_date') && $request->has('end_date')) { $query->whereBetween('videos.external_date', [ $request->input('start_date'), $request->input('end_date'), ]); } // Retrieve the results (consider using paginate() for large sets) $clips = $query->get(); return response()->json($clips); } }