2014-03-12 28 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的构建在你的第二个模型中的功能,并去。