get("keyword", ""); $query = Programs::query()->with(["appends", "video_pivots.video"])->where("status", "=", 1)->orderByDesc("created_at"); if ($keyword) { $keyword_split = explode(" ", $keyword); foreach ($keyword_split as $_keyword) { $_keyword = trim($_keyword); if (mb_strlen($_keyword) > 0) { $query->where(function (Builder $_query) use ($_keyword) { $_query ->where("name", "like", "%{$_keyword}%") ->orWhere("difficulty", "like", "%{$_keyword}%") ->orWhere("desc", "like", "%{$_keyword}%") ->orWhereHas("appends", function (Builder $__query) use ($_keyword) { $__query->where("from", "like", "%{$_keyword}%"); $__query->orWhere(function (Builder $sub_query) use ($_keyword) { $sub_query ->where("is_original", "=", 0) ->where("name", "like", "%{$_keyword}%"); }); }) ; }); } } } $programs = $query->paginate(10)->withQueryString(); return view("program.index", [ "keyword" => $keyword, "programs"=>$programs, ]); } public function videos(Request $request, Programs $program) { $videos = $program->video_pivots; foreach ($videos as $video_pivot) { // 节目开始/结束位置的 OCR 快照(无 OCR 数据的分P为 null,视图不展示) $video_pivot->start_ocr = VideoOcrUtil::find_frame_at($video_pivot->video_bvid, $video_pivot->start_part, $video_pivot->start_time); $video_pivot->stop_ocr = VideoOcrUtil::find_frame_at($video_pivot->video_bvid, $video_pivot->stop_part ?? 1, $video_pivot->stop_time); } return view("program.video.index", [ "program" => $program, "videos" => $videos, ]); } }