CodeIgniter部分覆盖了一个方法

时间:2014-03-12 23:48:52

标签: php codeigniter oop

我正在尝试重构这段代码。最初我有两个不同的模型,都延伸了MY_Model。但是,大多数代码都是重复的,所以现在我有了First_model扩展MY_Model而Second_model扩展了First_model。我从Second_model中清除了它继承自First_model的大部分代码,但是我在Second_model中有几个方法与First_model中的相同方法略有不同。请考虑以下代码:

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变量中的查询。我想知道我可以以某种方式使第一个模型中的方法受到保护,只在第二个模型中更改查询吗?或者是否有更有效的方法来减少此代码?我有几个方法适用于同样的事情,并且在新类中继续重新定义方法似乎有点多。

1 个答案:

答案 0 :(得分: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并继续。