2014年5月10日土曜日

CakePHP で複数のデータベースのテーブルを Join する

先日、複数のサブシステムを統合した社内システムを開発してリリースした。
裏話というか Tips になるけど、
開発に着手しはじめ、技術仕様について考えていた時、もっとも考え込んだのはデータベース。
複数のサブシステムのあるシステムなので、サブシステム毎にデータベースを分けて管理したいと思っていた。

共通化出来るエンティティ群と4つのサブシステム毎にあるエンティティ群をリンクする必要がある事が分かり、
リンクが必要な際はデータベースが異なるテーブル同士を JOIN して。。。
しかし CakePHP で複数データベースを取り扱った事が無く、
また CakePHP のモデル同士を繋ぐアソシエーションの設定や Model->find のオプションで、異なるデータベースのテーブル同士の JOIN が可能なのかも知らなかった。
Model->query で出来るのは分かるけど、非常に便利なアソシエーションや Model->find で出来ないと CakePHP の恩恵が半減するので調べてみたところ、Model->find でも異なるデータベースの JOIN が出来るのが分かったのが大きかった。

実際に実装に組み込んだものだが、例として共通テーブルの Shop と、サブシステムAの Report テーブルを JOIN してみる。
※実際はもっとリファクタリングして共通化したりしているけれど
class Shop extends AppModel {

    public $useDbConfig = 'commons';

}

class Report extends AppModel {

    public $useDbConfig = 'sub-a-systems';

    public $belongsTo = array(
        'Shop' => array('type' => 'INNER'),
    );

}

class ReportsController extends AppController {

    public $uses = array('Report');

    public function index() {

        $model = $this->{$this->modelClass};

        $reports = $model->find('all', array(
            'fields' => array(
                'Report.*',
                'Shop.name AS shop_name',
            ),
            'joins' => array(
                array(
                    'type'       => 'INNER',
                    'tables'     => 'commons.shops',
                    'alias'      => 'Shop',
                    'conditions' => 'Report.shop_id = Shop.id'
                ),
            ),
            'recursive' => -1,
        );

    }

}
そう、ただ joins オプションの tables プロパティの値にテーブル名を入れれば出来るようでしたwww
もし同じような事を検討している人がいたならば、参考になれば幸いです。

[参考]
モデルの属性 — CakePHP Cookbook 2.x ドキュメント http://book.cakephp.org/2.0/ja/models/model-attributes.html

準備

何か全然ブログ書いて無かった。。。
来週、再来週の仕事の準備を終えて何となく思いにふけってみた事を書き留めてみます。

プロスポーツ選手が試合などの大事な舞台に向けて練習するように、
アーティストがライブに向けてリハーサルを入念にやるように、
ビジネスマンも例外無く、きっちり準備する事がとても大切と思う。

しかしビジネスマンってやろうとか言うてたのに日常の忙しさで忘れてしまったり、
やらないといけない事なのに他の事で時間を取られてドンドン後回しにしてしまったり。
こんな事が良く見たり耳にするけど、社会では皆一緒やと思うのに何故か。。

出来る人ってそういう当たり前の事をきっちりしてる。
今まで出会って来た人の中で、この人は仕事出来るなぁとか仕事のスピードが早いなぁと感じた人は、色々接していく中で皆当たり前の事と思って普通にやっていた。

自分に置き換えてみると、今まで出来て居なかった事もあったり、
気分屋なので出来ている時と出来ていない時があったりしていたなぁと思う(^_^;)

余暇は息抜きやリフレッシュすることも大事だけど、
仕事や将来の準備の時間を作る事も大事やなぁと思う。
少なくとも自分はだっさい仕事の仕方や結果、あと将来つまらない人間になりたくないから、
もっとキッチリせんとな(`・ω・´)ゞ