2009-08-28 3 views
1

現在、私はデータエントリ(レコード)を取得するためにパターンを使用しています。 1つのレコードで作業する必要がある場合は、素晴らしい作品です。しかし、複数のレコードが関わる場合は、より複雑になります。ここで複数のレコードへのPHPデータアクセス

は、連絡先のテーブルを使用して、私の基本パターンです:

class Contacts_Entry { 

    private $_entry = Array('contact_id' => false, 
          'name'  => false, 
          'email'  => false, 
          'phone'  => false, 
          'type'  => false); 

    private $_entryKey = Array('contact_id' => 'i', 
           'name'  => 's', 
           'email'  => 's', 
           'phone'  => 's', 
           'type'  => 'i'); 


    public function __call($_method, $_arguments) 
    { 
     /* API: Get */ 
     if (substr($_method, 0, 3) == 'get') { 
      return $this->_getElement(camelCaseToUnderscore(substr($_method, 3))); 
     } 
     /* API: Set */ 
     if (substr($_method, 0, 3) == 'set' && count($_arguments) == 1) { 
      return $this->_setElement(camelCaseToUnderscore(substr($_method, 3)), $_arguments[0]); 
     } 
     unset($_method,$_arguments); 
     return false; 
    } 

    private function _getElement($_element) 
    { 
     if (!array_key_exists($_element, $this->_entry)) { return false; } 

     if ($this->_entryKey[$_element] == 's') { 
      if (!strlen($this->_entry[$_element])) { return false; } 
     } elseif ($this->_entryKey[$_element] == 'i') { 
      if (!strlen($this->_entry[$_element]) || !is_numeric($this->_entry[$_element])) { return false; } 
     } elseif ($this->_entryKey[$_element] == 'a') { 
      if (!count($this->_entry[$_element])) { return false; } 
     } else { 
      return false; 
     } 

     return $this->_entry[$_element]; 
    } 

    private function _setElement($_element, $_data) 
    { 
     if (!array_key_exists($_element, $this->_entry)) { return false; } 

     if ($this->_entryKey[$_element] == 's') { 
      if (!strlen($_data)) { return false; } 
     } elseif ($this->_entryKey[$_element] == 'i') { 
      if (!strlen($_data) || !is_numeric($_data)) { return false; } 
     } elseif ($this->_entryKey[$_element] == 'a') { 
      if (!count($_data)) { return false; } 
     } else { 
      return false; 
     } 

     if ($this->_entry[$_element] = $_data) { return true; } 
     return false; 
    } 

    public function load($_entryId) 
    { 
     // Code to load an entry into $this->_entry; 
    } 

    public function save() 
    { 
     // Code to save an entry from $this->_entry; 
    } 
} 

あなたが見ることができるように、これは、単一のレコードを非常によく動作します。このオブジェクトをSmartyに渡して、テンプレートの中でgetMethod()を使用することもできます。

しかし、私は考えを助けるのに必要なのは、この種の実装をして、それがクリーンな方法で複数のレコードに対して機能するようにする良い方法です。

+0

外部からの希望の動作を記述すると、クラスのユーザーが達成できるようにするにはどうすればよいでしょうか。その後、あなたは実装について心配することができます... –

答えて

1

あなたは車輪を再発明しています。自分で実装する必要があると判断する前に、まずexisting ORM(またはORM article in the wikipedia)を見てください。

+0

私は本当に私のホイールthoが好きです:P – Spot

+0

あなたは正しいです。 – Spot

0

なぜ単にオブジェクト(配列)のリストとして使用しないでください。したがって、配列を繰り返し処理できます。各配列ノードにはそれぞれ独自のオブジェクトがあります。それで全部です。