No.472
【CakePHP3】ORMを使わず生データを取得する【CakePHP4】
entityを使わずにデーターベースの生の値を見たい
CakePHPのentityは非情に協力で便利な機能だが、反面、便利すぎて問題を起こすことがある。
例えば下記のような状況が考えられる。
- MySQLのDECIMAL型はentityではfloatに変換される。
- DECIMALでの整数の桁数は任意だが、floatは有効桁数が14桁である。
- その場合、15桁以上の整数値はfloat型では指数表示になってしまう。
- 指数表示を理解できないメソッドが全て誤動作する。
といった具合である。
entityは生データを参照することができないため、こういった情報を扱う際はORMを使わず自力でデーターベースから値を取得しなくてはならない。
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)になることに注意!