ひでメモ

プログラムについて勉強したことを書きます。たぶん。

Laravel

【Laravel】whereIn メソッドで生成されるIN句の中にサブクエリを書く

問題 以下のように複数のIDを指定して一括で更新したい場面がありました。 $divIds = Div::where('hoge_flg', true)->select('id')->get(); User::whereIn('div_id', $ids)->update(['hoge_flg' => true]); ただ、上記のように書くと2回クエリが発行されるの…

Laravel Sail 環境で Sail をインストールする前だとイメージのビルドができない

Sail インストール前だと Docker イメージのビルドがこける これは開発環境の初期構築時のみに発生する問題です。 Laravel Sail 環境で Sail 本体がインストール前、つまり composer install 実行前だと以下のようなエラーが出て Docker イメージのビルドが…

【Laravel】モデルのアクセサでリレーションを呼ぶと N+1 問題になるときの回避方法

ある日 Telescope 上で同じクエリが数十件発行されているリクエストを見つけて驚きました。 コードを追ってみるとどうやらモデルのアクセサでリレーションが呼ばれていることが原因のようでした。 そもそもそういうコードを書くな、ということなのでしょうが…

【PHPUnit】php artisan test --parallel するときに設定ファイルを指定する

現在のプロジェクトでは CI でテストのジョブを分散させるために PHPUnit の設定ファイル(デフォルトだと phpunit.xml )が複数あります。 そのため、以下のようなことを同時にやりたい場合が発生します。 php artisan test --parallelでテストを並列実行する…

【Laravel】assertDatabaseHas のテーブル名の取得をモデルから行ったほうが可読性が上がる気がする

テストで下記のようにデータベースの中身を確認するパターンよくあると思います。 $this->assertDatabaseHas( 'm_user', // テーブル名を文字列で指定 [ 'id' => $user->id, 'user_name' => $user->user_name, ]); ただ、テーブル名を文字列で指定するのって…

【Laravel】CI での自動テストを並列化したらジョブの時間が短縮した

概要 CI での PHPUnit で行う自動テストで並列化オプションを有効にしたらテストが早く終わるようになりました。 ローカルではもちろん使っていたんですが CI でも有効したらいいじゃんと気づいたので有効しました。 並列化オプション parallelオプションで…

【Laravel】php artisan schema:dump でマイグレーションファイルを圧縮したらテストが早くなるか試してみた

結論 マイグレーションの圧縮をしても速度はほぼ変わりませんでした。 というかプロジェクトの CI 環境では遅くなりました… もちろん、うちの環境では、という話なのでマイグレーションファイルの数や内容によっては早くなることも十分あると思います。 一例…

【SQL・Laravel】大量の withCount を半生SQLに書き換えて高速化した話

状況がピンポイントすぎるのですがたまーに有り得そうだなと思い、自分の備忘録も兼ねて記事を書きました。 いろいろなテーブルに対して異なる条件で withCount を大量に行ったため、処理が重く画面が表示できない(リクエストがタイムアウトする)状態だった…

【Laravel】レート制限の判定方法とホワイトリストのやり方

記事はたくさんあるんですがコードを見てへ~となったのでメモです。 あとうちのプロジェクトで実装している簡易ホワイトリストの実装も。 概要 プロジェクトではログイン処理がN分内にM回試行されると一時的なロックをかけるようにしています。(もちろんセ…

GitLab の CI/CD でデプロイ先に応じて環境変数を変える

目的 フロントエンドで使用する環境変数を環境ごとに変えたいため、ビルド前に環境変数をセットするのが目的です。 Laravel Mix を使うと頭に MIX が付いている環境変数をフロントエンドと共有できますが、当然フロントエンドのビルド時点で設定されている必…

【Laravel】Http ファサードを使って API を叩く際のエラー判定

Laravel で API を実行するために Http ファサードを使ったのですがエラー判定でちょっと躓いたのでメモです。 レスポンス前後でエラーを出し分ける レスポンスの成否判定に便利な failed メソッドがあります。 下記に書いてあるとおりステータスコード 400 …

【Laravel】Laravel のバージョンアップでバリデーションルールの微妙な仕様変更に対応した

Laravel のバージョンを 5.X => 8.X にアップデートした際に FormRequest のバリデーションルールの仕様が微妙に変わっていてテストがコケました。 2点だけですがせっかく調べたので書き残しておきます。 どこを調べたのか ドキュメント見ても1行でさらっと…

【Laravel】ディレクトリを削除するメソッドにディレクトリを削除しないオプションがあった

Laravel にはディレクトリごと中身のファイルが削除できるdeleteDirectoryメソッドがあります。 ファイルストレージ 8.x Laravel deleteDirectory メソッドを使用して、ディレクトリとそのすべてのファイルを削除できます。 ドキュメントにもこのように書い…

【Laravel】レスポンスでファイルを返した後にファイルを削除する処理のテスト

Laravel で「ファイルをダウンロードした後はそのファイルは削除」する処理を実装したときにテスト方法にちょっと手間取ったのでメモです。 前提 Laravel では以下のように書けばファイルをダウンロード後、そのファイルを削除してくれます。 return respons…

LaravelのEager Loading(複数・ネスト)

Laravelでモデルにリレーションを設定して、withメソッドでその参照先を引いてきてくれる機能、Eager Loadingっていうんですね。 laravel.com これを複数設定していたり、参照先で引いてきた先でもさらにリレーションが設定してあって(ネストでいいんですか…