2014-03-12 57 views
0

我想重構一下這段代碼。最初我有兩種不同的模型,都擴展了MY_Model。但是,大部分代碼都是重複的,所以現在我有First_model擴展MY_Model,Second_model擴展First_model。我從Second_model中清除了從First_model繼承的大部分代碼,但是我在Second_model中有幾個與First_model中的方法稍有不同的方法。請看下面的代碼:CodeIgniter部分覆蓋了一個方法

First_model

class First_model extends MY_Model 
{ 

private function getPostsByPostIDs($postIDs) 
    { 
     $postIDs = $this->strictCastIntArray($postIDs); 
     $postIDSqlArray = implode(",", $postIDs); 
     $year = date('Y'); 
     $month = date('n'); 
     $sql = "SELECT 
        post.id, 
        post.useraccount_id, 
        user.first_name user_first_name, 
        user.last_name user_last_name, 
        user.gender user_gender, 
        user.profile_pic user_profile_pic, 
        post.class_id, 
        post.school_id school_id, 
        school.display_name school_name, 
        school.state, 
        school.city, 
        post.karma_awarded_id, 
        post.is_parent_post, 
        post.reply_to_post_id, 
        post.comment_text, 
        post.image_url, 
        post.ts_created, 
        UNIX_TIMESTAMP(post.ts_created) post_timestamp, 
        post.ts_modified, 
        user.facebook_uid user_facebook_id, 
        user.id user_id, 
        sum(ka.karma) monthly_karma 
       FROM 
        WallPosts post 
        JOIN UserAccounts account ON (account.id = post.useraccount_id) 
        JOIN Users user ON (user.id = account.user_id) 
        LEFT JOIN Schools school ON (post.school_id = school.id) 
        LEFT JOIN KarmaAwarded ka ON (ka.user_id IN (SELECT 
                    IFNULL(u_all.id, user.id) 
                   FROM UserAccounts ua 
                    INNER join Users u ON u.id = ua.user_id 
                    LEFT join Users u_all ON u_all.facebook_uid = u.facebook_uid 
                   WHERE ua.id = post.useraccount_id) 
                AND YEAR(ka.ts_created) = {$year} 
                AND MONTH(ka.ts_created) = {$month}) 
       WHERE 
        post.id IN ({$postIDSqlArray}) 
        GROUP BY post.id"; 

     $query = $this->db->query($sql); 
     $queryResults = $query->result_array(); 
     $functionResults = array(); 
     foreach ($queryResults as $row) { 
      $functionResults[$row["id"]] = $row; 
     } 
     return $functionResults; 
    } 
} 

Second_model

class Second_model extends First_model 
{ 

private function getPostsByPostIDs($postIDs) 
    { 
     $postIDs = $this->strictCastIntArray($postIDs); 
     $postIDSqlArray = implode(",", $postIDs); 
     $year = date("Y"); 
     $month = date("n"); 
     $sql = "SELECT 
        post.id, 
        post.useraccount_id, 
        user.first_name user_first_name, 
        user.last_name user_last_name, 
        user.gender user_gender, 
        user.profile_pic user_profile_pic, 
        post.class_id, 
        post.school_id school_id, 
        school.display_name school_name, 
        school.state, 
        school.city, 
        post.karma_awarded_id, 
        post.is_parent_post, 
        post.reply_to_post_id, 
        post.comment_text, 
        post.image_url, 
        UNIX_TIMESTAMP(post.ts_created) ts_created, 
        post.ts_modified, 
        user.facebook_uid user_facebook_id, 
        user.id user_id, 
        SUM(ka.karma) monthly_karma, 
        post.answer_status_flags 
       FROM 
        WallPosts post 
        JOIN UserAccounts account ON (account.id = post.useraccount_id) 
        JOIN Users user ON (user.id = account.user_id) 
        LEFT JOIN Schools school ON (post.school_id = school.id) 
        LEFT JOIN KarmaAwarded ka ON (ka.user_id IN (
         SELECT 
          IFNULL(u_all.id, user.id) 
         FROM 
          UserAccounts ua 
          INNER JOIN Users u ON (u.id = ua.user_id) 
          LEFT OUTER JOIN Users u_all ON (u_all.facebook_uid = u.facebook_uid) 
         WHERE ua.id = post.useraccount_id) 
         AND YEAR(ka.ts_created) = {$year} AND MONTH(ka.ts_created) = {$month}) 
       WHERE 
        post.id IN ({$postIDSqlArray}) 
       GROUP BY post.id"; 

     $query = $this->db->query($sql); 
     $queryResults = $query->result_array(); 
     $functionResults = array(); 
     foreach ($queryResults as $row) { 
      $functionResults[$row['id']] = $row; 
     } 
     return $functionResults; 
    } 
} 

注意唯一不同的是在$ SQL變量查詢。我想知道是否可以以某種方式使第一個模型中的方法受保護,並且僅在第二個模型中更改查詢?或者是否有更有效的方法來修剪這些代碼?我有幾種方法適用於這種情況,並且在新類中繼續重新定義方法似乎有點多。

回答

0

我曾經想通過$ SQL作爲你的模型變量:

在你的第一個模型,你將有:

private $sqlPostId = ''; 

public function __construct() { 
    $this->sqlPostId = "SELECT 
        post.id, 
        post.useraccount_id, 
        user.first_name user_first_name, 
        user.last_name user_last_name, 
        user.gender user_gender, 
        user.profile_pic user_profile_pic, 
        post.class_id, 
        post.school_id school_id, 
        school.display_name school_name, 
        school.state, 
        school.city, 
        post.karma_awarded_id, 
        post.is_parent_post, 
        post.reply_to_post_id, 
        post.comment_text, 
        post.image_url, 
        post.ts_created, 
        UNIX_TIMESTAMP(post.ts_created) post_timestamp, 
        post.ts_modified, 
        user.facebook_uid user_facebook_id, 
        user.id user_id, 
        sum(ka.karma) monthly_karma 
       FROM 
        WallPosts post 
        JOIN UserAccounts account ON (account.id = post.useraccount_id) 
        JOIN Users user ON (user.id = account.user_id) 
        LEFT JOIN Schools school ON (post.school_id = school.id) 
        LEFT JOIN KarmaAwarded ka ON (ka.user_id IN (SELECT 
                    IFNULL(u_all.id, user.id) 
                   FROM UserAccounts ua 
                    INNER join Users u ON u.id = ua.user_id 
                    LEFT join Users u_all ON u_all.facebook_uid = u.facebook_uid 
                   WHERE ua.id = post.useraccount_id) 
                AND YEAR(ka.ts_created) = {$year} 
                AND MONTH(ka.ts_created) = {$month}) 
       WHERE 
        post.id IN ({$postIDSqlArray}) 
        GROUP BY post.id"; 

} 

private function getPostsByPostIDs($postIDs) 
{ 
     $postIDs = $this->strictCastIntArray($postIDs); 
     $postIDSqlArray = implode(",", $postIDs); 
     $year = date('Y'); 
     $month = date('n'); 

     // Here you use the defined variable in the constructor 
     $query = $this->db->query($this->sqlPostId); 

     $queryResults = $query->result_array(); 
     $functionResults = array(); 
     foreach ($queryResults as $row) { 
      $functionResults[$row["id"]] = $row; 
     } 
     return $functionResults; 
    } 

然後你只需要改變SQL的構建在你的第二個模型中的功能,並去。