ランサーズ等のサービスを開発・運用する中で得た知識やノウハウを紹介しています。

Labels:  CakePHP 投稿者:nakajiman

CakePHP 3.4 ORM のクエリを調べてみた exists 編

愛犬のダックスをサマーカットし過ぎて失敗した nakajiman です。毛並みがチクチクして痛いのです。

CakePHP 3.4 ORM がどんなクエリを発行しているのか調べてみます。まず、簡単なところで、レコードが存在するかどうか調べる exists を見てみます。

Cake Console を使います。CakePHP のバージョン は、次のとおりです。

$ bin/cake console
>>> use Cake\Core\Configure;
>>> Configure::version();
=> "3.4.9"

続けて Cake Console でクエリログを表示する ようにします。

>>> use Cake\Log\Log;
>>> Log::config('queries', ['className' => 'Console', 'stream' => 'php://stderr', 'scopes' => ['queriesLog']]);
>>> $cm = \Cake\Datasource\ConnectionManager::get('default');
>>> $cm->logQueries(true);

Users テーブルにある ID を持つレコードが存在するか exists で確認してみます。

>>> use Cake\ORM\TableRegistry;
>>> $User = TableRegistry::get('Users');
>>> $User->exists(['id' => 1]);

次のようなクエリが発行されました。SELECT 1 は、まったくデータをフェッチしないということですね。また LIMIT 1 で走査する範囲を最小にしてますね。CakePHP 1.3 だと COUNT 句を使っていて、スケールしたら死亡フラグが立ってたんですが、これなら安心ですね。

SELECT 1 AS `existing` FROM users Users WHERE id = 1 LIMIT 1

ソースコードも確認してみます。お、Hydration を無効にして、Entity を生成しないようにしてますね。ソースコードレベルでもコストを抑える工夫がされてます。

    /**
     * {@inheritDoc}
     */
    public function exists($conditions)
    {
        return (bool)count(
            $this->find('all')
            ->select(['existing' => 1])
            ->where($conditions)
            ->limit(1)
            ->enableHydration(false)
            ->toArray()
        );
    }

といった感じで CakePHP 3.4 の exists は、なかなかの好印象でした。

ランサーズではサービスを成長させてくれるエンジニア、デザイナーを募集しています!
ご興味がある方は、以下URLよりご応募ください。


【中途採用】
サービスリードエンジニア
テックリード(アーキテクト)
フロントエンドエンジニア
サーバーサイドエンジニア
業務エンジニア(社内システム基盤・基幹システム)

【インターン・学生バイト】
19新卒対象サマーインターン
エンジニアインターン

その他採用情報

関連記事

CakePHP1.3→2.8移行が完了しました。

SREチームの金澤です。 1年以上かけて取り組んできた、CakePHP1.3→2.8バージョンアップが完了しましたので報告いたします。 ランサーズ社のCakePHPの取り組み ランサーズは現在11年目ですが、永らくバージョンアップをしておらず、PHP 5.3 …

レジェンドコードと向き合いレガシーからモダンへ変革する

shin ( @nagatashinyalan )です。 先日、BASEさん、ReBuildさん、ランサーズ で、「レガシーコード改革!UT/CIでWebサービスの技術的負債を解消する取り組み」 というイベントを開催し、そこで登壇しましたので資料を公開します。 …

ランサーズのNginx+PHP-FPM化

インフラエンジニアの金澤です。 以前ブログでお話しました、ランサーズのNginx+PHP-FPM化が一段落したのでまとめました。 移行の目的 以前は、Apache 2.2 + mod_php の構成で動作していました。 以前のブログでもお話ししましたように、P …