syed_h
syed_h

Reputation: 120

Extending a method in PHP

I have two methods which are 90% identical, ie 90% repetitive code. I am trying to extend the 2nd method.

First Method:

public function getResultsByID($userID = null){
    $sqlParams = array();
    if (!$userID)
            {
                throw new Exception("No User ID Provided");
            }   

    $sqlParams['userID'] = $userID;
    $sql = "SELECT t.user_id,
                   t.owner_id,
                   t.store_id
            FROM users t
            LEFT JOIN store s
            ON s.store_id = t.store_id
            WHERE t.user_id = :userID";

    $db = $this->dbWrite : $this->dbRead;       
    $results = $db->getRow($sql, $sqlParams);

    return $results;

}

My Second method is pretty identical except that I am joining multiple tables into this.

public function getMoreResultsByID($userID = null){
    $sqlParams = array();
    if (!$userID)
            {
                throw new Exception("No User ID Provided");
            }   

    $sqlParams['userID'] = $userID;
    $sql = "SELECT t.user_id,
                   t.owner_id,
                   t.store_id
            FROM users t
            LEFT JOIN store s ON s.store_id = t.store_id
            LEFT JOIN owner_contact oc ON oc.owner_id = t.owner_id
            LEFT JOIN owner_detail od ON od.owner_id = t.owner_id
            WHERE t.user_id = :userID";

    $db = $this->dbWrite : $this->dbRead;       
    $results = $db->getRow($sql, $sqlParams);

    return $results;

}

I am unable to figure out how to extend my getMoreResultsByID() from getResultsByID() so that I can get rid of identical code

Thanks in advance

Upvotes: 1

Views: 98

Answers (3)

user3337714
user3337714

Reputation: 673

You can pass two parameters two the function getResultsById

<?php

public function getMoreResultsByID($userID = null, join = TRUE){
    $sqlParams = array();
    if (!$userID)
            {
                throw new Exception("No User ID Provided");
            }   

    $sqlParams['userID'] = $userID;
    $sql = "SELECT t.user_id,
                   t.owner_id,
                   t.store_id
            FROM users t";
    if (join){
        $sql.="LEFT JOIN store s ON s.store_id = t.store_id
                LEFT JOIN owner_contact oc ON oc.owner_id = t.owner_id
                LEFT JOIN owner_detail od ON od.owner_id = t.owner_id";
    }else{
        $sql.="LEFT JOIN store s
                ON s.store_id = t.store_id";
    }
    $sql.="WHERE t.user_id = :userID";

    $db = $this->dbWrite : $this->dbRead;       
    $results = $db->getRow($sql, $sqlParams);

    return $results;

}

Upvotes: 0

Deepak Nirala
Deepak Nirala

Reputation: 836

You dont need to add two function to do same work all you need to do is pass parameter to function

public function getResultsByID($userID = null,$flag){
    $sqlParams = array();
    if (!$userID)
        {
            throw new Exception("No User ID Provided");
        }   

    $sqlParams['userID'] = $userID;
    if($flag=value1){
       $sql = "SELECT t.user_id,t.owner_id,t.store_id
        FROM users t
        LEFT JOIN store s
        ON s.store_id = t.store_id
        WHERE t.user_id = :userID";
    }elseif($flag=value2){
        $sql = "SELECT t.user_id,
               t.owner_id,
               t.store_id
        FROM users t
        LEFT JOIN store s ON s.store_id = t.store_id
        LEFT JOIN owner_contact oc ON oc.owner_id = t.owner_id
        LEFT JOIN owner_detail od ON od.owner_id = t.owner_id
        WHERE t.user_id = :userID";
    }

    $db = $this->dbWrite : $this->dbRead;       
    $results = $db->getRow($sql, $sqlParams);

    return $results;
} 

Upvotes: 2

Vishwa
Vishwa

Reputation: 1545

You could create another private method where you pass SQL query and userId as parameters like this.

<?php

private function queryResults($sql, $userID = null){
    $sqlParams = array();
     if (!$userID)
        {
            throw new Exception("No User ID Provided");
        }   

    $sqlParams['userID'] = $userID;
    $db = $this->dbWrite : $this->dbRead;       
    $results = $db->getRow($sql, $sqlParams);

    return $results;

}
?>

Then, you can use your methods like this.

<?php
public function getResultsByID($userID = null){
    $sql = "SELECT t.user_id,
                   t.owner_id,
                   t.store_id
            FROM users t
            LEFT JOIN store s
            ON s.store_id = t.store_id
            WHERE t.user_id = :userID";

    return $this->queryResults($sql, $userID);
}

Similarly, the other one. You can also modify your queryResults() method further, to serve other methods in your class.

Upvotes: 5

Related Questions