php-codeigniterによってインスタンス化されたデータベースオブジェクトのタイプは何ですか?
私はCodeIgniterにかなり慣れていないので、簡単ではないはずだと思うことを理解しようとしています。
私のアプリケーションはProductオブジェクトを少し処理します。これは、Momenetで、CodeIgniterのDatabaseクラスに含まれているActiveRecord機能を介して実行しています。私は通常、ビジネスロジックをデータベースロジックから適切に分離するために、ActiveRecordよりもORMを好みます。ただし、この場合、Productsを使用するオブジェクトは通常、すべてのビジネスロジック自体を処理するため、分離は引き続き有効だと思います。
私のProductオブジェクトは、データベース接続をパラメーターとして受け入れたい store()
メソッドを介してデータベースと対話します。 store()
メソッドは、最初にデータベースにクエリを実行して、問題の製品がすでに何らかの形で存在するかどうかを判断します。その場合、製品は新しい情報で更新され、そうでない場合は製品が挿入されます。簡単なもの。問題は、 store()
メソッドパラメーターに型ヒントを使用したいので、基本的なCodeIgniterデータベース/ActiveRecord関数を使用できないオブジェクトがに渡されないようにすることです。適切なエラーが発生しないメソッド。
私の一生の間、CodeIgniterデータベースクラスのタイプを理解することはできません。ソースコードを少し読んだ後、しばらくの間、CI_DB_driverクラスがそのクラスだと思いました。ただし、これをタイプヒントとして使用すると、IDE(正確には、NetBeans 7.01)は、 insert()
や get_where()
。 query()
やinsertString()
のようなメソッドを認識しているという点で、私のIDEに問題があるとは思いません。
データベースにアクセス/接続する標準のCodeIgniterの方法を使用できます。つまり、内部のCodeIgniterオブジェクトのloadメソッドを使用してデータベースオブジェクトをインスタンス化できますが、ややろくでなしのユニットの一部として製品を挿入または更新したいと思っていました。作業パターン。 Productオブジェクトは、他のProductオブジェクトの挿入や更新の成功に依存しないため、トランザクションを使用する必要はありません(Productオブジェクトを使用するクラスも依存しません)。ただし、挿入または更新するすべてのProductオブジェクトに対してまったく新しい接続を作成したり、永続的なデータベース接続と結び付けたりする必要はありません。次のようなことをしたいのですが:
// catalog class is just an example
class Catalog extends CI_Model
{
public function updateCatalog(array &$products, $dbconn = null) {
if ($dbconn === null) {
try {
$dbconn = $this->load->database('default', true);
} catch (SQLException $e) {
show_error($e->getMessage);
}
$close_db = true;
}
foreach ($products as $product) {
try {
// use the same db connection for all product storage tasks
$product->store($dbconn);
} catch (SQLException $e) {
show_error($e->getMessage);
}
}
if ($close_db) {
$dbconn->close(); // free up database connection for other tasks
}
}
...
これは非常に基本的な例です。別のメソッドが上記のメソッドを呼び出す必要がある場合は、データベース接続オブジェクト自体をインスタンス化し、それを渡します。理想的には、リクエスト全体ごとに1つのデータベース接続を目指しています。
データベースオブジェクトの型ヒントとして何を使用すべきかを知るために、CodeIgniterのソースコードを深く掘り下げた人はいますか?私がCodeIgniterで使用するのに悪いアプローチをしているのですか?接続プールを実装する手段でCodeIgniter機能をオーバーライドする方が良いでしょうか?
答え :
解決策:
$this->load->database()
によって返されるデータベースオブジェクトのタイプは、実際にはCI_DB_driverであり、これが私が望んでいたものです。実際には、タイプはCI_DB_(データベースタイプを挿入)_driverですが、これはCI_DB_driverから継承されます。
これが誰かに役立つかどうかはわかりませんが、念のためにこれを公開しています。
答え :
解決策:
タイプヒントの意味はわかりませんが、CodeIgniterデータベースクラスを使用したくないようです。では、CodeIgniterをいじくり回す代わりに、好きな外部ORMクラスを含めてみませんか?
次のリソースを確認してください:
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。