モデルをいくつかの部分 A、B、C、D、E、F に分割しました。これらの部分は何を表しているのでしょうか?
まず、A、この Base はフレームワーク全体の基本クラスを表し、すべてのモデル ファイルはこの基本クラスから継承する必要があります。
B の内容は D に依存する必要があるため、まず D について説明します。D には、データベースの接続と終了、およびデータベース ドライバーの選択を管理する ConnectionManager があります。この名前はよくありません。まず、これで何とかしてください。データベースの接続と終了を担当するため、次のメソッドが必要です:
1
1 |
3 | public static function getConnection(){} |
2
4 | public static function releaseConnection() {} |
5 | } |
<テーブル>
3
<テーブル>
5
01 |
02 | interface IDbDriver { |
03 | function execute($sql); |
04 | function connect(); |
05 | function close(); |
06 | function getAllByObject(); |
07 | function getAllByAssocArray(); |
08 | function getAllByArray(); |
09 | function beginTrans(); |
10 | function commit(); |
11 | function rollback(); |
12 | } |
Connect はデータベースに接続することを意味し、execute は SQL を実行することを意味します。SQL がクエリの場合、getAllByObject はオブジェクトを通じてクエリ結果を返すことを意味し、getAllByAssocArray は結果を連想配列として返すことを意味します。 getAllByArray は通常の配列として結果を返すことを意味し、beginTrans はトランザクションを開くこと、つまり autoCommit をオンにすることを表し、commit はトランザクションを送信することを意味し、rollback はトランザクションをロールバックすることを意味し、close は DB を閉じることを意味します。
実際、クエリ結果を返すときに、それをイテレータにカプセル化することもできます。
さて、B を見てみましょう。まず、ModelBase を見てみましょう。これは、クエリ、挿入、更新など、外部から見えるさまざまな関数をカプセル化しています。 delete、execute、fetchAll など、つまり B 内のすべてのドライバー クラスは外部から直接アクセスできないため、誰がアクセスできるかというと、ModelBase ですが、直接アクセスするのではなく、ConnectionManager 経由でアクセスします。
ConnectionManager は設定ファイルに従ってドライバーを自動的に選択するため、ModelBase はどのドライバー クラスを呼び出しているかを知りません。ただし、ドライバー クラスはすべてコントラクトに従っているため、ModelBase はどのドライバーを意識する必要はありません。コントラクト上のメソッドを呼び出します。
<テーブル>
01 |
02 | class ModelBase extends Base { |
04 | public function __construct() { |
02
05 | $this->_db = ConnectionManager::getConnection(); |
06 | } |
07 | public function execute($sql) { |
08 | $this->_db->execute($sql); |
09 | } |
10 | } |
たとえば、上記のコードでは、ModelBase をインスタンス化するときに、10 個の ModelBase が同時にインスタンス化された場合でも、ConnectionManager の getConnection が呼び出されてデータベース接続を取得します。 , クラスでは、データベース接続操作は 1 回だけです。
上記の規約により、この層で SQL を実行するのは非常に簡単です。ドライバー クラスの実行メソッド、つまり $this->_db->execute($sql); を呼び出すだけです。
ModelBase について説明した後、SQL 解析について説明します。その主な機能は、データベースの ORM を実装するときに SQL 解析が必要になる場合です。
この層は ModelBase からも呼び出されます。呼び出しメソッドは $this->where()->order()->select() です。 , この種の関数チェーンは非常に使いやすいものであり、SQL Parse はこれらの関数の実際の意味を解析して ModelBase に返し、解析された SQL を取得して $this- を実行します。 > ;_db->execute($sql) だけで十分なので、どのようなパターンであっても、最終的にはドライバー クラスのexecuteメソッドが呼び出されて SQL が実行されます。
実際にはテーブルモデルとリレーショナルモデルは ModelBase で一部の操作が完結しているので、テーブルモデルとリレーショナルモデルは ModelBase を継承するだけで分かりやすいです。テーブル モデルは単一のテーブルのコンテンツを処理するため、追加のコンテンツが含まれます。たとえば、$this->select() を実行する場合、システムはクエリのコンテンツを指定できません。クエリを実行するテーブル。おそらく、最終的に解析される SQL は select * from XXX です。これはリレーショナル モデルにも当てはまります。
C と E について説明すると、モデル層は実際には特定のビジネスを実装するためにリレーショナル モデルまたはテーブル モデルのメソッドを呼び出しているだけであることを理解するのは簡単です。
FにはCacheなどの通常のデータベース以外の処理やその他の内容が含まれています。ここではアイデアを話すだけなので、この内容については時間があれば書きます。そうでない場合は、後で話してください。