2016-10-19 1 views
1

商用アプリケーションでは、データベース構成でマスタ/スレーブ機能を使用しており、マスタとしてMSSQL(ビジネス要件)dbを、スレーブとしてMySQL dbを実行しています。私たちはスレーブ(MySQL)からの読み取り要求を行い、マスタ(MSSQL)に要求を書きたいと思います。マスターからスレーブへデータをコピーするバックグラウンドジョブを設定しました。Yii2 Mater Slave Steupのレコードを変更する

マスターに更新を加えようとしましたが、生成されたSQLがMSSQL構文ではなく、MSSQL構文を持っていたため、失敗しました。 接続がマスターに正しく切り替えられています。私はデシベル/ QueryBuilder.phpファイル内の()関数で、

public function update($table, $columns, $condition, &$params) 
{ 

    if (($tableSchema = $this->db->getTableSchema($table)) !== null) { 
     $columnSchemas = $tableSchema->columns; 
    } else { 
     $columnSchemas = []; 
    } 

    $lines = []; 
    foreach ($columns as $name => $value) { 
     if ($value instanceof Expression) { 
      $lines[] = $this->db->quoteColumnName($name) . '=' . $value->expression; 
      foreach ($value->params as $n => $v) { 
       $params[$n] = $v; 
      } 
     } else { 
      $phName = self::PARAM_PREFIX . count($params); 
      $lines[] = $this->db->quoteColumnName($name) . '=' . $phName; 
      $params[$phName] = !is_array($value) && isset($columnSchemas[$name]) ? $columnSchemas[$name]->dbTypecast($value) : $value; 
     } 
    } 

    $sql = 'UPDATE ' . $this->db->quoteTableName($table) . ' SET ' . implode(', ', $lines); 
    $where = $this->buildWhere($condition, $params); 
    return $where === '' ? $sql : $sql . ' ' . $where; 
} 

更新をチェックすると

$this->db->quoteColumnName($name) 

は常にMySQLのフォーマットを取得しているようです。 mssql/QueryBuilder.phpファイルのQueryBuilderクラスにMSSQL形式を追加する必要があります。このシナリオでスキーマがどのように選択されているか混乱しています

$this->db 

この問題を解決する方法を教えてください。前もって感謝します!

サム

+0

に接続する適切な使用高度なテンプレートchowを使用してapp/config/main.phpまたはmain-local ..もしあなたが基本的なshow config/db.phpを使用しているなら – scaisEdge

答えて

0

を使用すると、単一のデータベース接続を使用しているようだ..あなたがduobleデータベースが適切なDBに関連するそれらのそれぞれを接続する必要がある可能性があり

例:MSSQL

のためのMySQLとDB2のDB1
return [ 
    'components' => [ 
     'db1' => [ 
      'class' => 'yii\db\Connection', 
      'dsn' => 'mysql:host=localhost;dbname=db1mysql_name', 
      'username' => 'db1username', 
      'password' => 'db1password', 
     ], 
     'db2' => [ 
      'class' => 'yii\db\Connection', 
      'dsn' => 'sqlsrv:Server=your.ip.address.here;Database=db2msssql_name', // change your.ip.address.here with a proper if 
      'username' => 'db2username', 
      'password' => 'db2password', 
     ], 
    ], 

、その後、あなたがある場合は、右デシベル

Yii::$app->db1; 

Yii::$app->db2; 
関連する問題