1

そのため、現在、パターンを使用してデータ エントリ (レコード) を取得しています。1 つのレコードだけで作業する必要がある場合は、これでうまくいきます。ただし、複数のレコードが関係する場合は、さらに複雑になります。

連絡先テーブルを使用した私の基本パターンは次のとおりです。

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() を使用することもできます。

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

4

2 に答える 2

1

あなたは車輪を再発明しています。自分で実装する必要があると判断する前に、まず既存の ORM (またはウィキペディアの ORM 記事)を調べてください。

于 2009-08-28T07:49:51.713 に答える
0

単にオブジェクトのリスト(配列)として使用してみませんか。したがって、配列を反復処理できます。各配列ノードには独自のオブジェクトがあります。それで全部です。

于 2009-08-28T14:44:36.983 に答える