0

データベースからデータを取り出し、そのデータに基づいてオブジェクトを作成するクラスを作成しようとしています。CodeIgniter を使用しています。

問題はid、メソッドに が指定されている__constructが、データベース テーブルに が含まれていないid場合、オブジェクトが返されますが、すべてのプロパティが に設定されていることNULLです。

NULLこれをチェックして、対応する行がない場合にオブジェクトの代わりに返す方法はありますか?

class JS_Model extends CI_Model
{
    protected $database_table_name;
    protected $database_keys;
    ...

    public function __construct($id = NULL){
        if($id){
            $this->getFromDatabase($id);
        }
    }

    ...

    function getFromDatabase($id){
        foreach($this->database_keys as $key){
           $this->db->select($key);
        }
        $this->db->from($this->database_table_name);
        $this->db->where('id', $id);
        $this->db->limit(1);
        $q = $this->db->get();

        if ($q->num_rows() > 0){
            foreach($q->result() as $property){     
                foreach($property as $key => $value){
                    $this->$key = $value;
                }
            }
        } else {
            // NEED TO SET THE OBJECT TO NULL FOR THIS CASE
        }
    }

    ...

}

どんな助けでも大歓迎です。

4

2 に答える 2

4

これは不可能です。一度__construct呼び出されると、オブジェクト インスタンスを受け取ります。

これを処理する正しい方法はException、コンストラクター内で from をスローすることです。

class JS_Model extends CI_Model
{
    protected $database_table_name;
    protected $database_keys;

    public function __construct($id = NULL){
        if($id){
            $row = $this->getFromDatabase($id);
            if (!$row) {
                throw new Exception('requested row not found');
            }
        }
    }
}

try {
    $record = new JS_Model(1);
} catch (Exception $e) {
    echo "record could not be found";
}
// from here on out, we can safely assume $record holds a valid record
于 2013-09-06T09:20:12.397 に答える
1

コンストラクターを非公開にして、GetInstance() などのメソッドを使用しないでください。このようなもの。私はもうphpをあまり書いていないので、構文が間違っているかもしれません:-(。

class JS_Model extends CI_Model
{
protected $database_table_name;
protected $database_keys;
...

private function __construct($id = NULL){

}
public static function GetInstance($id)
{
  $x = new JS_Model($id);
  $x->getFromDatabase($id);
  if(is_object($x))
  {
    return $x;
  }
  return null;

}
...

function getFromDatabase($id){
    foreach($this->database_keys as $key){
       $this->db->select($key);
    }
    $this->db->from($this->database_table_name);
    $this->db->where('id', $id);
    $this->db->limit(1);
    $q = $this->db->get();

    if ($q->num_rows() > 0){
        foreach($q->result() as $property){     
            foreach($property as $key => $value){
                $this->$key = $value;
            }
        }
    } else {
       return null;
    }
}

...

}
于 2013-09-06T09:32:04.350 に答える