CakePHP

CakePHP 4.x に ParaTest を導入

CakePHP 4.x に ParaTest を導入 テストの数が増えてきて全件テストを実行するのに時間がかかるようになった為、ParaTestを導入し、テストを並列実行するようにしてみました。 version CakePHP: 4.4.10 ParaTest: v6.9.1 PHPUnit: 9.6.7 ドキュメント https:…

CakePHP4.x: hasMany の Association を contain すると 別SQL になる仕組み

以前、hasMany の Association を contain すると 別SQL になるという内容の記事を書きました 今回は、どのような仕組みで別SQLになるのか、コアのコードを追ってみました version CakePHP: 4.2.8 仕組み \Cake\ORM\EagerLoader::loadExternal によって、別S…

CakePHP 4.x: DBのデータ型 から PHPの型(Entityのpropertyの型) へのCast

DBのデータ型 から PHPの型(Entityのpropertyの型) への変換 \Cake\Database\Type 以下の Class の toPHP メソッドで行われる 例 \Cake\Database\Type\StringType::toPHP` 一覧 \Cake\Database\TypeFactory::$_types PHPの型(Entityのpropertyの型) から DB…

CakePHP 4.x: .env ファイルを有効化する (留意点あり)

留意点をメモ ドキュメント https://book.cakephp.org/4/en/development/configuration.html#environment-variables 有効化方法 ① config/bootstrap.php の以下をアンコメントアウト // if (!env('APP_NAME') && file_exists(CONFIG . '.env')) { // $dotenv…

CakePHP 4.x: Crud\Action\EditAction のレスポンスに data を含める

Crud.afterSave で Config の api.success.data.row を設定 CakePHP 4.x: FriendsOfCake/crud の Config の api.success.data キー class UsersController extends AppController { public function beforeFilter(EventInterface $event): void { parent::be…

CakePHP 4: イベントシステムの概要

CakePHP 4.x: イベントシステム 概要 CakePHPのイベントシステム モデル・ビヘイビアー・コントローラー・ビュー・ヘルパーのコールバックの心臓部 why クラスの結合度を下げる コードの関心事を明確に分離させる how Observer パターン オブジェクトがイベ…

CakePHP 4.x: hasMany, belongsToMany でアソシエーションしたテーブルのレコードを contain で取得する際は、JOIN でなく、別のSQLで取得している

アソシエーションしたテーブルのレコードを contain して取得する際に実行される SQL は下記のように異なる hasOne の場合は JOIN で取得 hasMany は別SQLで取得 追記 CakePHP4.x: hasMany の Association を contain すると 別SQL になる仕組み ドキュメン…

CakePHP 4.x: FriendsOfCake/crud の Config の api.success.data キー

Config の api.success.data キー は \Crud\Listener\ApiListener::_ensureData で参照される https://github.com/FriendsOfCake/crud/blob/master/src/Listener/ApiListener.php#L231 以下の指定方法がある api.success.data.row api.success.data.subject …

CakePHP 4.x: クエリログを出す方法

// logs/queries.log にクエリログを出力 $connection->enableQueryLogging(true); コントローラ内であれば、こんな感じ $this->テーブル名->getConnection()->enableQueryLogging(); ※3.x では $this->テーブル名->getConnection()->logQueries(true); だっ…

PHP: メモリ使用量の確認方法

note CakePHP の場合は、app/webroot/index.php の先頭と最後に下記のコードを差し込んで確認した https://www.php.net/manual/ja/function.memory-get-usage.php https://www.php.net/manual/ja/function.memory-get-peak-usage.php //ini_set('memory_limi…

CakePHP 4.x: `TableClass->find()...->all()` では `ResultSet` が返り、`ResultSet` を foreach で回すと `PDOStatement::fetch` しDBから取得したデータがメモリ上に展開される

※2022/02/05: 追記 (->toArray() する際の注意点) ドキュメント クエリービルダー - テーブルから行を取得する TableClass->find()...->all() では ResultSet が返り、ResultSet を foreach で回すと PDOStatement::fetch しDBから取得したデータがメモリ上…

CakePHP 4x: AuthenticationMiddleware の挙動と、ログイン時に毎回From認証するサンプル

AuthenticationMiddleware の挙動が把握できておらず、ハマったのでメモ AuthenticationMiddleware の挙動 チュートリアル に // src/Application.php public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue { $middlewareQueue /…

CakePHP 4x: JST の Chronos インスタンスで diffInMonths すると正しい結果が得られない (回避方法も記載)

(2021/01/18 追記) 次回リリースされるバージョンの Chronos では問題が解消されるようです #283 にて修正済み UTC 以外の場合は diffInMonthsIgnoreTimezone() を使えばok バージョン PHP: 7.4.11 CakePHP: 4.1.5 Chronos: 2.0.6 what すでに公式に issue …

CakePHP4 : DebugKit を無効化

バージョン CakePHP : 4.1.5 DebugKit を無効化 app/src/Application.php の bootstrap() 内の $this->addPlugin('DebugKit'); をコメントアウト public function bootstrap(): void { // if (Configure::read('debug')) { $this->addPlugin('DebugKit'); //…

CakePHP3: 同じSQLを複数実行しないように

ドキュメント Cake\ORM\Table::get($id, $options = []) メモ 下記の場合、同じクエリが2回実行されている $category_id = $this->Articles->get(1)->categoriy_id; $author_id = $this->Articles->get(1)->user_id; 下記のようにすれば、クエリ1回の実行で…

FriendsOfCake/crud: findMethod() の引数

メモ: FriendsOfCake/crud: findMethod() の引数 public function index() { $this->Crud->action()->findMethod([ // カスタム Finder メソッド を指定 // See: Crud - findMethod 'myCustomFinder' => [ // Cake\ORM\Table::find($type, $options = []) の…

CakePHP3: マイグレーションでカラムの型を string から uuid に変更

試行錯誤したのでメモ。もっとシンプルな方法があると思う。。 ドキュメント カラムの属性を変更 作業ログ public function change() { $this->table('hoges') ->changeColumn( 'foo_column', 'uuid', [ 'null' => false, ] ) ->save(); } ↑ ではうまく行か…

CakePHP3: クエリビルダーで SUM(CASE WHEN)

こんな感じの SELECT 文を作りたい場合は、 SELECT user_id AS "user_id", (SUM( CASE WHEN hoge < 3 THEN count END )) AS "A", (SUM( CASE WHEN hoge >= 10 THEN count END )) AS "B" FROM articles GROUP BY user_id こんな感じ $query = $articles->find…

CakePHP3 (3.2以降): クエリビルダーで DATE 型のフィールドを取得すると、Cake\I18n\FrozenDate オブジェクトが返される

クエリビルダで DATE 型のフィールドを取得すると、Cake\I18n\FrozenDate オブジェクトが返される 同じく、DATETIME 型を取得すると、Cake\I18n\FrozenTime オブジェクトが返される サンプル var_dump( $query->find()-> .... ->get('field_date') ); //fiel…

CakePHP3: 行ロック(SELECT 〜 FOR UPDATE)

BEGIN; SELECT 〜 FOR UPDATE; /* COMMITするまで選択した行をロック*/ UPDATE 〜; COMMIT; これを CakePHP3 で行うと ConnectionManager::get('default')->transactional(function () use ($id) { $query = $this->TableClass; $query->find()->where(['id'…

CakePHP3: $validator->scalar() は integers, floats, strings, booleans, を許可する

This method will accept integers, floats, strings and booleans, but not accept arrays, objects, resources and nulls. See: https://api.cakephp.org/3.5/class-Cake.Validation.Validation.html#_isScalar

CakePHP3: ディレクトリを指定してマイグレーションを実行

備忘録 See: https://book.cakephp.org/migrations/2.x/ja/#migrate # デフォルトで、マイグレーションファイルは、 **config/Migrations** ディレクトリーに # あります。 ``--source`` オプション (省略形は ``-s``) を使用することで、 # ディレクトリー…

CakePHP3: Migrations でテーブルを Drop する

備忘録 ->save() を忘れない See Phinx - Dropping a Table Note that like other methods in the Table class, drop also needs save() to be called at the end in order to be executed. サンプル 例: tests テーブを削除 /// 空のマイグレーションファイ…

CakePHP3 の $validator->integer() は string の '1' を許可する

備忘録 CakePHP3 の $validator->integer() は string の '1' を許可する ソースは以下 See \Cake\Validation\Validation::isInteger() https://api.cakephp.org/3.8/class-Cake.Validation.Validator.html#_integer This method will accept strings that c…