refine代码不仅仅是写代码,整体业务逻辑简化,结构上的简化能带来10倍的代码简化,能让client做的事情千万别让serve做。
譬如下面的代码,column实际上是category(分类)的含义,实际上客户端能将分类和子分类取出来,就能简化N多服务器sql了:
<?php // 服务器端处理 function get_column_video2($array) { extract($array); $column_id = isset($column_id) ? (int) $column_id : 0; $start = isset($start) ? (int) $start : 0; $pagesize = isset($pagesize) ? (int) $pagesize : 10; $status = isset($status) ? (int) $status : ''; $uid = isset($uid) ? (int) $uid : ''; $date = isset($date) ? $date : ''; $search_text = isset($search_text) ? $search_text : ''; $updatemin = isset($updatemin) ? (int) $updatemin : ''; $updatemax = isset($updatemax) ? (int) $updatemax : ''; $sort = isset($sort) ? $sort : ''; $order = isset($order) ? $order == 'asc' ? 'asc' : 'desc' : 'desc'; $where_str = ''; if ($status) { $where_str .= " and status = '$status'"; } else { $where_str .= " and status >= 7 "; } if ($uid) { $where_str .= " and creator_id = '$uid'"; } //某一天的数据 if ($date) { $timestamp = strtotime($date); $endtime = 24 * 3600 + $timestamp; $where_str .= " and ( v.create_time >= $timestamp and v.create_time < $endtime) "; } elseif ($updatemin || $updatemax) { if ($updatemin && $updatemax) { $where_str .= " and ( v.update_time >= $updatemin and v.update_time < $updatemax) "; } elseif ($updatemin) { $where_str .= " and v.update_time >= $updatemin "; } else { $where_str .= " and v.update_time <= $updatemax "; } } $where_like = ''; if ($search_text) { $search_text = mysql_real_escape_string($search_text); $where_like .= "or title like '%" . $search_text . "%' "; $where_like .= "or synopsis like '%" . $search_text . "%' "; $where_like .= "or key_words like '%" . $search_text . "%' "; $where_str .= 'and (' . trim($where_like, 'or') . ')'; } if (in_array($sort, array('create_time', 'update_time', 'airtime'))) { $orderBy = " order by v.$sort $order "; } else { $orderBy = ' order by v.id ' . $order; } $limit = "limit $start , $pagesize"; $website_id = $this->session->userdata('website_id'); if($website_id){ $website_videos_sql = "(select v.* from vms_video_metadata as v inner join vms_column"; $website_videos_sql .= " as c on (v.column_id = c.id and c.website_id = '$website_id' ))"; } if ($column_id) { if ($column_id !== -1) { $column = $this->db->get_where('column', array('id' => $column_id))->row(); if (isset($column->column_level) && !$column->column_level) { $sql = "select v.*,u.user_name,c1.column_level , c1.column_name as column_name3 ,c2.column_name as column_name2,c3.column_name as column_name1 from $website_videos_sql as v inner join vms_column as c on (c.root_id = '$column_id' and c.id = v.column_id ) left join vms_column as c1 on (c1.id = v.column_id) left join vms_column as c2 on (c2.id = c1.parent_id) left join vms_column as c3 on (c3.id = c2.parent_id) left join vms_user as u on (u.id = v.creator_id) where v.is_removed = 0 $where_str $orderBy $limit "; $count = $this->db->query("select count(*) as count from $website_videos_sql as v inner join vms_column as c on (c.root_id = '$column_id' and c.id = v.column_id ) where v.is_removed = 0 $where_str ")->row()->count; } else { $sql = "select v.*,u.user_name,c1.column_level , c1.column_name as column_name3 ,c2.column_name as column_name2,c3.column_name as column_name1 from $website_videos_sql as v inner join vms_column as c on (c.id = v.column_id) left join vms_column as c1 on (c1.id = v.column_id) left join vms_column as c2 on (c2.id = c1.parent_id) left join vms_column as c3 on (c3.id = c2.parent_id) left join vms_user as u on (u.id = v.creator_id) where (c.id = '$column_id' or c.parent_id = '$column_id') and v.is_removed = 0 $where_str $orderBy $limit "; $count = $this->db->query("select count(*) as count ". "from $website_videos_sql as v inner join vms_column as c on (c.id = v.column_id) ". "where (c.id = '$column_id' or c.parent_id = '$column_id') and v.is_removed = 0 $where_str " )->row()->count; } } else { $sql = "select v.*,u.user_name from $website_videos_sql as v left join vms_user as u on (u.id = v.creator_id) where v.column_id = '0' and v.is_removed = 0 $where_str $orderBy $limit "; $count = $this->db->query("select count(*) as count ". "from $website_videos_sql as v where v.column_id = '0' and". " v.is_removed = 0 $where_str " )->row()->count; } } else { $sql = "select v.*,u.user_name,c1.column_level , c1.column_name as column_name3 ,c2.column_name as column_name2,c3.column_name as column_name1 ". "from $website_videos_sql as v left join vms_column as c1 on (c1.id = v.column_id) left join ". "vms_column as c2 on (c2.id = c1.parent_id) left join vms_column as c3 on (c3.id = c2.parent_id) left join vms_user as u on (u.id = v.creator_id) ". "where v.is_removed = 0 $where_str $orderBy $limit "; $count = $this->db->query("select count(*) as count from $website_videos_sql ". "as v left join vms_column as c on (c.id = v.column_id) where v.is_removed = 0 $where_str " )->row()->count; } if ($rs = $this->db->query($sql)->result_array()) { $data['rs'] = $rs; $data['count'] = $count; } return isset($data) ? $data : array( 'rs' => '', 'count' => 0 ); }
<?php // 改变结构,客户端负责部分逻辑 function get_video_list($category_id, $page_start, $page_size, $sort, $order) { if (!in_array($order, array('asc', 'desc'))) { $res = Error_Utils::parse(Error_Utils::PARAMETER_INVLIAD_ORDER); return $res; } if (!$category_id || (count(explode(',', $category_id)) == 0)) { $res = Error_Utils::parse(Error_Utils::PARAMETER_INVLIAD_CATEGORY_IDS); return $res; } $order_by = " order by v.id $order"; if ($sort && in_array($sort, array('create_time', 'update_time', 'airtime'))) { $order_by = " order by v.$sort $order"; } $v_is_not_remove = "v.is_removed = ".NOT_REMOVE; $status_str = "status >= ".NOT_RELEASE; $limit = "limit $page_start , $page_size"; $from_where = " from vms_video_metadata as v, vms_user as u"; $from_where .= " where u.id = v.creator_id and v.column_id in ($category_id)" $from_where .= " and $v_is_not_remove and $status_str"; $from_where .= " $order_by $limit"; $video_list_sql = "select v.*, u.user_name $from_where"; $video_count_sql = "select count(*) as count $from_where"; $data = array( 'res' => array(), 'total' => 0, 'count' => 0 ); $video_list = $this->db->query($video_list_sql)->result_array(); $video_count = $this->db->query($video_count_sql)->row()->count; if (!$video_list) { $res = Error_Utils::parse(Error_Utils::SUCCESS, "", $data); return $res; } $data['res'] = $video_list; $data['total'] = $video_count; $data['count'] = count($data['res']); foreach ($data['res'] as $key => $value) { $data['res'][$key]['thumbnail_val'] = $data['res'][$key]['thumbnail_url']; $data['res'][$key]['thumbnail_url'] = PIC_V($data['res'][$key]['thumbnail_url']); } $res = Error_Utils::parse(Error_Utils::SUCCESS, "", $data); return $res; }