16

さて、私の最初の質問は何度も変更されたので、それを削除して質問を再定式化することにしました。問題の適切な解決策を見つけるために、さまざまなモデル名で小さなテストケースプロジェクトを作成しました。

警告:データベーステーブルを混同しないでください

動機:法的な問題とパフォーマンスの問題のために、ユーザーデータを複数のデータベースに分割しました。

現在、私は複数の'を持ち、それぞれが複数のテーブルテーブルの1つ)を持つ独自のデータベースを持っているCakePHPプロジェクトに取り組んでいます。今、私は最初に何かを説明する必要があります:UserUsercars

すべてUserに独自のデータベース(テーブルやデータベースではない)があるため、データベース名は次のようになります。

  • [データベース] app(これはアプリのメインデータベースです)
    • [テーブル]users
    • [表] permissionsこの質問には関係ありません
  • [データベース] app_user1( 1はこのデータベースUser.id全体を所有します)
    • [TABLE] cars( 1が完全に所有するテーブルUser.id
  • [データベース] app_user2( 2はこのデータベースUser.id全体を所有しています)
    • [TABLE] cars( 2が完全に所有するテーブルUser.id
  • 等...

データベース/テーブルの定義とモデルとの関係を明確にする可能性のある小さな図面を作成しました。

CakePHPの1つのモデルに複数のデータベースを動的に使用する方法

問題!!!

ログインするまで、どのデータベースに接続するかわかりません。とそのデータベースは動的に作成されるため、を使用できません。UserUserapp/Config/database.php

だから私は現在、CakePHPの基本的なデータベースの振る舞いをバイパスするためにModelとクラスの拡張機能を書いています。ConnectionManagerしたがって、Carモデルは使用するデータベースを認識しています。しかし、私はこれがもっと簡単にできると感じています!

だから私はそれがすべて1つの質問に要約されると思います:

これを行う簡単な方法はありますか?!

私の問題を読んで理解するために時間と労力を費やしてくれる人に感謝します!

4

5 に答える 5

38

この紳士オリビエ)も同じ問題を抱えていました!(1 年前)彼はs の小さな翻案を書きましたController! これはかなり小さく、1.3および2.xで動作します。

とにかく、これが私の最終的な解決策ですapp/Model/AppModel.php

class AppModel extends Model
{
  /**
   * Connects to specified database
   *
   * @param String name of different database to connect with.
   * @param String name of existing datasource
   * @return boolean true on success, false on failure
   * @access public
   */
    public function setDatabase($database, $datasource = 'default')
    {
      $nds = $datasource . '_' . $database;      
      $db  = &ConnectionManager::getDataSource($datasource);

      $db->setConfig(array(
        'name'       => $nds,
        'database'   => $database,
        'persistent' => false
      ));

      if ( $ds = ConnectionManager::create($nds, $db->config) ) {
        $this->useDbConfig  = $nds;
        $this->cacheQueries = false;
        return true;
      }

      return false;
    }
}

そして、これが私の中でそれをどのように使用したかですapp/Controller/CarsController.php:

class CarsController extends AppController
{
  public function index()
  {
    $this->Car->setDatabase('cake_sandbox_client3');

    $cars = $this->Car->find('all');

    $this->set('cars', $cars);
  }

}

この問題を抱えたのは、私が最初でも最後でもありません。ですから、この情報が人々や CakePHP コミュニティを見つけてくれることを心から願っています。

于 2012-11-05T00:45:44.003 に答える
9

データベースの実際の名前をコードに書き留めるという考えは好きではありません。複数のデータベースの場合、必要な数のデータベースを設定できる database.php ファイルがあります。

その場で特定のモデルのデータベースを「切り替え」たい場合は、 setDataSourceメソッドを使用します。(こちらをご覧ください

たとえば、2 つのデータベースがある場合、例として、database.php ファイルでそれらを「デフォルト」および「サンドボックス」として定義できます。

次に、コードで:

$this->Car->setDataSource('sandbox');

サンドボックスは構成の名前であり、データベースの実際の名前は database.php ファイルに一度だけ書き込まれます。

于 2013-01-31T09:47:47.983 に答える
1

mysql の完全な表記法を使用して、いつでも任意のデータベースにクエリを実行できます。例:

SELECT * FROM my_schema_name.table_name;

ケーキの方法:

$db = $this->getDataSource();
$query = array(
    'fields' => array('*'),
    'table' => 'my_schema_name.table_name'
);
$stmt = $db->buildStatement($query, $this);
$result = $db->execute($stmt);
于 2014-05-02T21:35:29.363 に答える