前回、モデルのドライバー クラスを実装しました。ConnectionManager は構成ファイルで構成されたドライバー名に従ってドライバー クラスをインスタンス化する必要があるため、最初にドライバー名を構成ファイルに追加します。
01 |
02 | return array( |
03 | 'defaultController' => 'Index', |
04 | 'defaultAction' => 'index', |
05 | 'debug' => true, |
配列を返す(
06 | 'errorReporting' => -1, |
07 | 'timeZone' => 'PRC', |
03
08 | 'db' => array( |
09 | 'dsn' => 'mysql:dbname=test;host=localhost', |
10 | 'user' => 'test', |
11 | 'pwd' => 'test', |
12 | 'driver' => 'pdo' |
13 | ) |
14 | ); |
ここの db の下にあるドライバーがドライバー名です。
構成ファイルが完成したら、ConnectionManager クラスの 2 つの静的メソッド getConnection と releaseConnection の実装は非常に簡単です。まず、getConnection が構成ファイル内の構成に従ってドライバー クラスを選択します。もちろん、将来的には複数のモデル ファイルが存在する可能性があり、データベース接続は 1 つだけにするのが最善であるため、この場所はシングルトンでなければなりません。 releaseConnection はさらに単純で、ドライバー クラスの close メソッドを呼び出すだけです。直接。
01 |
02 | class ConnectionManager extends Base { |
04 | public static function getConnection() { |
02
05 | if(self::$_instance == null) { |
06 | //按照配置文件寻找驱动类,然后连接DB |
07 | switch(C('db=>driver')) { |
08 | case 'pdo' : |
09 | self::$_instance = new PdoDriver(); |
10 | break; |
11 | default : |
12 | self::$_instance = new PdoDriver(); |
13 | break; |
14 | } |
15 | } |
16 | return self::$_instance; |
17 | } |
18 | public static function releaseConnection() { |
19 | if(null !== self::$_instance) { |
20 | self::$_instance.close(); |
21 | } |
22 | } |
23 | } |
ConnectionManager を作成した後、ModelBase について説明します。このクラスは、後続のテーブル モデルとリレーショナル モデルの親クラスであるため、基本的に、execute、select、および外部からアクセスできるすべてのインターフェイスを定義します。更新、挿入、削除など。次に、比較的単純な ModelBase を作成しましょう。この例では、constructor、execute、getAll の 3 つのメソッドだけが SQL を実行し、getAll はデータを取得します。
注: 前に述べたように、オブジェクト、通常の配列、またはイテレータに従ってデータを返すことができる場合、ここでの getAll はより複雑になりますが、今回は getAll で直接 getAllByAssocArray を呼び出すため、このメソッドは非常に簡単です。
それでは、早速コードを投稿してみましょう。 !
01 |
02 | class ModelBase extends Base { |
04 | public function __construct() { |
02
05 | $this->_db = ConnectionManager::getConnection(); |
06 | } |
07 | public function execute($sql,Array $arr) { |
08 | $this->_db->prepare($sql); |
09 | $this->_db->execute($arr); |
10 | } |
11 | public function getAll() { |
12 | return $this->_db->getAllByAssocArray(); |
13 | } |
14 | } |
ここには数行のコードがないので、より複雑なことについては説明しません。 。 。
以前に SQL 解析を B に分割しました。これにより主に SQL 解析が完了します。単純なクエリ ステートメントの形式は次のとおりであることがわかっています。
SELECT [ALLDISTINCT] フィールド FROM テーブル WHERE whereCondition [GROUP BY groupCondition] [HAVING gettingCondition] [ORDER BY orderCondition]
以前は SQL 文字列を直接記述していましたが、この方法では SQL コンテンツの一部を指定するだけであれば、他のコンテンツ フレームワークを自動的に完成させることができ、メンテナンスが容易になります。もちろん、複雑な SQL にはこれをお勧めしません。
たとえば、テーブル モデルではテーブル名を指定しているため、フレームワークはテーブルを識別できる必要があり、フィールド部分はデフォルトで * にできますが、whereCondition がない場合は識別できません。 All Or DISTINCT のデフォルトは ALL です。
次に、テーブル モデルで関連付けられたテーブルが user であると仮定し、$this->select() を実行します。元の観点によれば、システムはクエリ ステートメントが何であるかを知りません。当然実行できませんが、フレームワークが SQL を自動的に完了できる場合、SQL は次のようになります:
ユーザーから * を選択
このような SQL ステートメントには問題はありません。