No.472


【CakePHP3】ORMを使わず生データを取得する【CakePHP4】

entityを使わずにデーターベースの生の値を見たい

 CakePHPのentityは非情に協力で便利な機能だが、反面、便利すぎて問題を起こすことがある。
 例えば下記のような状況が考えられる。

  • MySQLのDECIMAL型はentityではfloatに変換される。
  • DECIMALでの整数の桁数は任意だが、floatは有効桁数が14桁である。
  • その場合、15桁以上の整数値はfloat型では指数表示になってしまう。
  • 指数表示を理解できないメソッドが全て誤動作する。

 といった具合である。

 entityは生データを参照することができないため、こういった情報を扱う際はORMを使わず自力でデーターベースから値を取得しなくてはならない。

データベースの基本 > Select文の実行

 Query オブジェクトの execute() メソッドでコマンド実行、 fetchAll() メソッドで値を取得する。

use Cake\Datasource\ConnectionManager;

// class内にtestアクションを追加する
$sql = 'SELECT カラム1,カラム2,... FROM デーブル名 WHERE XXX=YYY';

$connection = ConnectionManager::get('default');
$results = $connection->execute($sql)->fetchAll('assoc');

 これにより下記のような配列が取得できる。
 CakePHP2の頃と同じ内容である。

[
  '0' => [
    'カラム1' => 値1A,
    'カラム2' => 値2A,
    ...
  ],
  '1' => [
    'カラム1' => 値1B,
    'カラム2' => 値2B,
    ...
  ],
]

 値がひとつでも階層が二段階(キーが0)になることに注意!