5

私のCodeigniterシステムは複数のデータベースを使用しています。すべてのページにすべてのデータベースが必要なわけではないので、必要なモデルに各接続をロードしてから、各コントローラー内に必要なモデルをロードします。この方法でロードすると、プロファイラーはこれらのデータベースからのクエリを表示しません。

これは、モデルにデータベースをロードする方法です。

$this->Companies_db = $this->load->database( 'companies', TRUE, TRUE );

以前は、すべてのデータベースをMY_Controller()(コアコントローラーの拡張)にロードしていました。そこにロードすると、プロファイラーは正常に機能します。モデルにロードすると、データベースクエリが表示されません。

データベースクエリは、_compile_queries()内のメソッドでコンパイルされていますsystem/libraries/Profiler.php。データベースがモデルにロードされているとき、それらのオブジェクトはCIオブジェクトにロードされていません。_compile_queries()以下のコードは、メソッドの最初の数行であり、これが発生している場所です。

foreach (get_object_vars($this->CI) as $CI_object)
    {
        if (is_object($CI_object) && is_subclass_of(get_class($CI_object), 'CI_DB') )
        {
            $dbs[] = $CI_object;
        }
    }

モデルにデータベースをロードするときに、CIプロファイラーにクエリを表示させるにはどうすればよいですか? または、より具体的には、データベースがモデルにロードされるときに、データベースオブジェクトをメインCIオブジェクトにロードするにはどうすればよいですか。

4

1 に答える 1

8

CIオブジェクトのインスタンスを取得し、そこにデータベースを保存して、プロファイラーでも利用できるようにします。

class My_Model {
     private $Companies_db;

     public function __construct(){
           $this->Companies_db = $this->load->database( 'companies', TRUE, TRUE );

           // Pass reference of database to the CI-instance
           $CI =& get_instance();
           $CI->Companies_db =& $this->Companies_db;  
     }
}
于 2012-07-10T23:54:34.673 に答える