2017-05-10 2 views
0

ビルドCakePHPモデル機能を使用して別のデータベースからテーブルを読み取ることは可能ですか? DATABASE_CONFIGではまったく異なる設定をしているのではなく、同じホスト、ユーザー、パスワードを使用しているというわけではありません。明白なこと:別のデータベースからテーブルを読み取る

class Provincia extends AppModel { 
    public $useTable = 'shared_data.dbo.provincia'; 
} 
class DebugController extends AppController { 
    public function index() { 
     /* @var $modeloProvincia Provincia */ 
     $modeloProvincia = ClassRegistry::init('Provincia'); 
     $provincias = $modeloProvincia->find('all'); 
    } 
} 

は...トリガー:

Error: Table shared_data.dbo.provincia for model Provincia was not found in datasource default.

+0

私はcakephpを知りませんが、SQL ServerではDBNAME.dbo.tablenameを実行できます。たぶん、DBNAME.dboを置いてください。 Provinciaの前に? – GuidoG

+0

@GuidoGこれはまさに私がやっていることです: 'public $ useTable = 'shared_data.dbo.provincia';'。何が失敗するかはCakePHP内部のものです。 –

+0

私は何とかそれを逃した。申し訳ありません。 – GuidoG

答えて

1

は、私がこれまでに私の調査結果を共有しましょう...

短い答えを:あなたができません。

CakePHPのマジックは、INFORMATION_SCHEMAビューからフェッチされたテーブルとカラムに関する情報に大きく依存しています。その情報は\Sqlserver::listSources(テーブルのリスト)と\Sqlserver::describe(カラムのリスト)に集約されています。

それはこれらのメソッドをデータソースドライバを拡張し、再実装することは可能ですが

// Model/Datasource/CustomSqlserver.php 
class CustomSqlserver extends Sqlserver { 
} 
class DATABASE_CONFIG { 
    public $default = array(
     'datasource' => 'CustomSqlserver', 
     // ... 
    ); 
} 

は...それは氷山の一角にすぎません。データ構造は、2つのレベルを占め:

  1. スキーマ(例えばdbo
  2. 表(例えばusers

それらは上部に余分データベースレベルのために設計されていません。その結果、多くのコードにパッチを当てる必要があり、その努力に値するものではありません。


私はSynonyms in SQL Serverでもプレイしています。 \CustomSqlserver::listSources\CustomSqlserver::describeは、通常の表のように動作するほとんどの(すべてではない)エフェクトに書く必要があるため、より有望な方法です。ただし、主な制限は、テーブル名が重複しないことです。

0

あなたはDATABASE_CONFIGへの新しい接続を追加する必要があるだろうが、あなたが継承できるように、コンストラクタでこれを行うことができますあなたのdefaultデータベースの認証情報とは、ちょうどdatabase名前を変更します -

public function __construct() { 
    $this->alt = $this->default; 
    $this->alt['database'] = 'provincia'; 
} 

は、その後、あなたのProvinciaモデルにあなたはaltデータベース接続に入れ替えることができます: -

public function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 
    $this->useDbConfig = 'alt'; 
} 
+0

'DATABASE_CONFIG'ではまったく異なる設定をしていますが、同じホスト、ユーザ、パスワードを使用して両方のデータベースに一度にアクセスしているわけではありません(たとえば、異なるモデルに属するモデルデータベース)。 –

+0

@ÁlvaroGonzález私が知っている限り、これを達成するには 'DATABASE_CONFIG'に新しい設定が必要ですが、' DATABASE_CONFIG'のコンストラクタで設定することで、既存のホスト、ユーザ、パスワードを使用してデータベース名。 – drmonkeyninja

+0

データソースドライバがそれをまったくサポートしていないと思われ始めました。 '\ Sqlserver :: listSources'では' SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES'を実行し、ここに表示されないものはすべて破棄します: –

関連する問題