PGPool + ORM Yii2を使用する

今日、PGPoolを使用する場合、ORM Yii2の小さな「ハック」があります。

はい、これらは再び松葉杖です(私の最初の記事のように)が、これらは(PostgreSQLの勝利の行進を与えられて)より多くの人々に役立つことができ、役に立つと思われます。



マスタースレーブモードでPGPoolを使用するすべてのユーザーは、遅かれ早かれ、ウィザードから選択するタスクに直面します。 幸いなことに、開発者は私たちの面倒を見てくれ、この機会を与えてくれました。 PGPoolの作業スキームを見た人は誰でも私を理解するでしょう:selectの前に単純な行/ * NO LOAD BALANCE * /を書き、PGpoolが要求をmasterデータベースに送信します。



問題は、ORMを使用する必要があるときに始まります。



Yii2を例として使用して、これまでのところこれを決定しました。



ActiveQueryクラスと、最も重要なことに、そのcreateCommand()メソッドをオーバーライドする



class ActiveQuery extends \yii\db\ActiveQuery { private $_noLoadBalance = false; /** *     ,     * * @return $this */ public function noBalance() { $this->_noLoadBalance = true; return $this; } /** * @inheritdoc */ public function createCommand($db = null) { /* @var $modelClass ActiveRecord */ $modelClass = $this->modelClass; if ($db === null) { $db = $modelClass::getDb(); } if ($this->sql === null) { list ($sql, $params) = $db->getQueryBuilder()->build($this); } else { $sql = $this->sql; $params = $this->params; } $comment = ''; if (true === $this->_noLoadBalance) { $comment = '/*NO LOAD BALANCE*/'; } return $db->createCommand($comment . $sql, $params); } }
      
      







そして、次のように使用します。



 $user = User::find()->where([ User::ATTR_ID => $userid, ]) ->noBalance() ->one();
      
      







そして、私は本当にYii開発者にこの「内部」を箱から出してなんとかしてもらいたいです。



All Articles