get('progress', 0.8); $offset = (int)$request->get('offset', 0); $limit = (int)$request->get('limit', 20); $channel_id = $request->get('channel'); // $chapters = false; switch ($request->get('view')) { case 'ids': $aChannel = explode(',', $request->get('channel')); $chapters = ProgressChapter::select("channel_id")->selectRaw("uid as id") ->with(['channel' => function ($query) { //city对应上面province模型中定义的city方法名 闭包内是子查询 return $query->select('*'); }]) ->where("book", $request->get('book')) ->where("para", $request->get('par')) ->whereIn('channel_id', $aChannel)->get(); $all_count = count($chapters); break; case 'studio': #查询该studio的channel $name = $request->get('name'); $studioId = StudioApi::getIdByName($request->get('name')); if ($studioId === false) { return $this->error('no user'); } $table = Channel::where('owner_uid', $studioId); if ($request->get('public') === "true") { $table = $table->where('status', 30); } $channels = $table->select('uid')->get(); $chapters = ProgressChapter::whereIn('progress_chapters.channel_id', $channels) ->leftJoin('pali_texts', function ($join) { $join->on('progress_chapters.book', '=', 'pali_texts.book'); $join->on('progress_chapters.para', '=', 'pali_texts.paragraph'); }) ->where('progress', '>', 0.85) ->orderby('progress_chapters.created_at', 'desc') ->skip($request->get("offset", 0)) ->take($request->get("limit", 1000)) ->get(); $all_count = ProgressChapter::whereIn('progress_chapters.channel_id', $channels) ->where('progress', '>', 0.85)->count(); break; case 'tag': $tm = (new TagMap)->getTable(); $pc = (new ProgressChapter)->getTable(); $t = (new Tag)->getTable(); $query = "select t.name,count(*) from $tm tm join tags as t on tm.tag_id = t.id join progress_chapters as pc on tm.anchor_id = pc.uid where tm.table_name = 'progress_chapters' and pc.progress > ? group by t.name;"; $chapters = DB::select($query, [$minProgress]); if ($chapters) { $all_count = count($chapters); } else { $all_count = 0; } break; case 'chapter-tag': if ($request->get('tags') && $request->get('tags') !== '') { $tags = explode(',', $request->get('tags')); foreach ($tags as $tag) { # code... if (!empty($tag)) { $tagNames[] = $tag; } } } $tm = (new TagMap)->getTable(); $pc = (new ProgressChapter)->getTable(); $tg = (new Tag)->getTable(); $pt = (new PaliText)->getTable(); $param[] = $minProgress; if (isset($tagNames)) { $where1 = " where co = " . count($tagNames); $a = implode(",", array_fill(0, count($tagNames), '?')); $in1 = "and t.name in ({$a})"; $param = array_merge($param, $tagNames); } else { $where1 = " "; $in1 = " "; } if (Str::isUuid($channel_id)) { $channel = "and channel_id = '{$channel_id}' "; } else { $channel = ""; } $query = " select tags.id,tags.name,co as count from ( select tm.tag_id,count(*) as co from ( select anchor_id as id from ( select tm.anchor_id , count(*) as co from $tm as tm left join $tg as t on tm.tag_id = t.id left join $pc as pc on tm.anchor_id = pc.uid where tm.table_name = 'progress_chapters' and pc.progress > ? $in1 $channel group by tm.anchor_id ) T $where1 ) CID left join $tm as tm on tm.anchor_id = CID.id group by tm.tag_id ) tid left join $tg on $tg.id = tid.tag_id order by count desc "; if (isset($param)) { $chapters = DB::select($query, $param); } else { $chapters = DB::select($query); } $all_count = count($chapters); break; case 'lang': $chapters = ProgressChapter::select('lang') ->selectRaw('count(*) as count') ->where("progress", ">", $minProgress) ->groupBy('lang') ->get(); $all_count = count($chapters); break; case 'channel-type': break; case 'channel': /** * 总共有多少channel */ $chapters = ProgressChapter::select('channel_id') ->selectRaw('count(*) as count') ->with(['channel' => function ($query) { return $query->select('*'); }]) ->leftJoin('channels', 'progress_chapters.channel_id', '=', 'channels.uid') ->where("progress", ">", $minProgress) ->where('channels.status', '>=', 30); if (!empty($request->get('channel_type'))) { $chapters = $chapters->where('channels.type', $request->get('channel_type')); } if (!empty($request->get('lang'))) { $chapters = $chapters->where('progress_chapters.lang', $request->get('lang')); } $chapters = $chapters->groupBy('channel_id') ->orderBy('count', 'desc') ->get(); foreach ($chapters as $key => $chapter) { $chapter->studio = StudioApi::getById($chapter->channel->owner_uid); } $all_count = count($chapters); break; case 'chapter_channels': /** * 某个章节 有多少channel */ $chapters = ProgressChapter::select( 'book', 'para', 'progress_chapters.uid', 'progress_chapters.channel_id', 'progress', 'channels.name', 'channels.type', 'channels.owner_uid', 'progress_chapters.updated_at' ) ->leftJoin('channels', 'progress_chapters.channel_id', '=', 'channels.uid') ->where("book", $request->get('book')) ->where("para", $request->get('par')) ->orderBy('progress', 'desc') ->get(); foreach ($chapters as $key => $value) { # code... $chapters[$key]->views = View::where("target_id", $value->uid)->count(); $likes = Like::where("target_id", $value->uid) ->groupBy("type") ->select("type") ->selectRaw("count(*)") ->get(); if (isset($_COOKIE["user_uid"])) { foreach ($likes as $key1 => $like) { # 查看这些点赞里有没有我点的 $myLikeId = Like::where([ "target_id" => $value->uid, 'type' => $like->type, 'user_id' => $_COOKIE["user_uid"] ])->value('id'); if ($myLikeId) { $likes[$key1]->selected = $myLikeId; } } } $chapters[$key]->likes = $likes; $chapters[$key]->studio = StudioApi::getById($value->owner_uid); $chapters[$key]->channel = ['uid' => $value->channel_id, 'name' => $value->name, 'type' => $value->type]; $progress_key = "/chapter_dynamic/{$value->book}/{$value->para}/ch_{$value->channel_id}"; $chapters[$key]->progress_line = Cache::get($progress_key); } $all_count = count($chapters); break; case 'chapter': $tm = (new TagMap)->getTable(); $pc = (new ProgressChapter)->getTable(); $tg = (new Tag)->getTable(); $pt = (new PaliText)->getTable(); //标签过滤 if ($request->has('tags') && !empty($request->get('tags'))) { $tags = explode(',', $request->get('tags')); foreach ($tags as $tag) { # code... if (!empty($tag)) { $tagNames[] = $tag; } } } if (isset($tagNames)) { $where1 = " where co = " . count($tagNames); $a = implode(",", array_fill(0, count($tagNames), '?')); $in1 = "and t.name in ({$a})"; $param = $tagNames; } else { $where1 = " "; $in1 = " "; } if ($request->has('studio')) { $studioId = StudioApi::getIdByName($request->get('studio')); $table = Channel::where('owner_uid', $studioId); if ($request->get('public') === "true") { $table = $table->where('status', 30); } $channels = $table->select('uid')->get(); $arrChannel = []; foreach ($channels as $oneChannel) { # code... if (Str::isUuid($oneChannel->uid)) { $arrChannel[] = "'{$oneChannel->uid}'"; } } $channel = "and channel_id in (" . implode(',', $arrChannel) . ") "; } else { if (Str::isUuid($channel_id)) { $channel = "and channel_id = '{$channel_id}' "; } else { $channel = ""; } } //完成度过滤 $param[] = $minProgress; //语言过滤 if (!empty($request->get('lang'))) { $whereLang = " and pc.lang = ? "; $param[] = $request->get('lang'); } else { $whereLang = " "; } //channel type过滤 if ($request->has('channel_type') && !empty($request->get('channel_type'))) { $channel_type = "and ch.type = ? "; $param[] = $request->get('channel_type'); } else { $channel_type = ""; } $param_count = $param; $param[] = $offset; $query = " select tpc.pc_uid as uid, tpc.book ,tpc.para,tpc.channel_id,tpc.title,pt.toc,pt.path,tpc.progress,tpc.summary,tpc.created_at,tpc.updated_at from ( select pcd.uid as pc_uid, ch.uid as ch_uid, book , para, channel_id,progress, title ,pcd.summary , pcd.created_at,pcd.updated_at from ( select uid, book,para,lang,progress,channel_id,title,summary ,created_at ,updated_at from ( select anchor_id as cid from ( select tm.anchor_id , count(*) as co from $tm as tm left join $tg as t on tm.tag_id = t.id where tm.table_name = 'progress_chapters' $in1 group by tm.anchor_id ) T $where1 ) CID left join $pc as pc on CID.cid = pc.uid where pc.progress > ? $channel $whereLang ) pcd left join channels as ch on pcd.channel_id = ch.uid where ch.status >= 30 $channel_type order by pcd.created_at desc limit {$limit} offset ? ) tpc left join $pt as pt on tpc.book = pt.book and tpc.para = pt.paragraph;"; $chapters = DB::select($query, $param); foreach ($chapters as $key => $chapter) { # code... $chapter->channel = Channel::where('uid', $chapter->channel_id)->select(['name', 'owner_uid'])->first(); $chapter->studio = StudioApi::getById($chapter->channel["owner_uid"]); $chapter->views = View::where("target_id", $chapter->uid)->count(); $chapter->likes = Like::where(["type" => "like", "target_id" => $chapter->uid])->count(); $chapter->tags = TagMap::where("anchor_id", $chapter->uid) ->leftJoin('tags', 'tag_maps.tag_id', '=', 'tags.id') ->select(['tags.id', 'tags.name', 'tags.description']) ->get(); } //计算按照这个条件搜索到的总数 $query = " select count(*) as count from ( select * from ( select anchor_id as cid from ( select tm.anchor_id , count(*) as co from $tm as tm left join $tg as t on tm.tag_id = t.id where tm.table_name = 'progress_chapters' $in1 group by tm.anchor_id ) T $where1 ) CID left join $pc as pc on CID.cid = pc.uid where pc.progress > ? $channel $whereLang ) pcd left join channels as ch on pcd.channel_id = ch.uid where ch.status >= 30 $channel_type "; $count = DB::select($query, $param_count); $all_count = $count[0]->count; break; case 'top': break; case 'search': $key = $request->get('key'); $table = ProgressChapter::where('title', 'like', "%{$key}%"); //获取记录总条数 $all_count = $table->count(); //处理排序 if ($request->has("order") && $request->has("dir")) { $table = $table->orderBy($request->get("order"), $request->get("dir")); } else { //默认排序 $table = $table->orderBy('updated_at', 'desc'); } //处理分页 if ($request->has("limit")) { if ($request->has("offset")) { $offset = $request->get("offset"); } else { $offset = 0; } $table = $table->skip($offset)->take($request->get("limit")); } //获取数据 $chapters = $table->get(); //TODO 移到resource foreach ($chapters as $key => $chapter) { # code... $chapter->toc = PaliText::where('book', $chapter->book)->where('paragraph', $chapter->para)->value('toc'); $chapter->path = PaliText::where('book', $chapter->book)->where('paragraph', $chapter->para)->value('path'); $chapter->channel = Channel::where('uid', $chapter->channel_id)->select(['name', 'owner_uid'])->first(); if ($chapter->channel) { $chapter->studio = StudioApi::getById($chapter->channel["owner_uid"]); } else { $chapter->channel = [ 'name' => "unknown", 'owner_uid' => "unknown", ]; $chapter->studio = [ 'id' => "", 'nickName' => "unknown", 'realName' => "unknown", 'avatar' => '', ]; } $chapter->views = View::where("target_id", $chapter->uid)->count(); $chapter->likes = Like::where(["type" => "like", "target_id" => $chapter->uid])->count(); $chapter->tags = TagMap::where("anchor_id", $chapter->uid) ->leftJoin('tags', 'tag_maps.tag_id', '=', 'tags.id') ->select(['tags.id', 'tags.name', 'tags.description']) ->get(); } break; case 'public': break; } if ($chapters) { return $this->ok(["rows" => $chapters, "count" => $all_count]); } else { return $this->error("no data"); } } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param \App\Models\ProgressChapter $progressChapter * @return \Illuminate\Http\Response */ public function show(ProgressChapter $progressChapter) { // } /** * Show the form for editing the specified resource. * * @param \App\Models\ProgressChapter $progressChapter * @return \Illuminate\Http\Response */ public function edit(ProgressChapter $progressChapter) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Models\ProgressChapter $progressChapter * @return \Illuminate\Http\Response */ public function update(Request $request, ProgressChapter $progressChapter) { // } /** * Remove the specified resource from storage. * * @param \App\Models\ProgressChapter $progressChapter * @return \Illuminate\Http\Response */ public function destroy(ProgressChapter $progressChapter) { // } }