Laravelのこといろいろ(ただのメモになっている)
API
Resourceにwithを記述するとよい
where設定する時、忘れやすい。かっこで括る感じ
and(('age', '<', 10)or('score', '>', 70))
->where(function($query){
$query->where('age', '<', 10)
->orWhere('score', '>', 70);
})
ログの確認しながら実施する時によくやるやつ
①デバッグしたい箇所にLogを仕込む
例。\Log::info(‘hoge');
②対象フォルダからドッカーの中に入る
% cd (プロジェクトフォルダ)
% docker-compose exec php ash
③最新のログ状態が確認できるようにtailしておく
# cd storage/logs
# tail -f laravel.log
コントローラーの作成
「ModelNameController」の前部分はプロジェクトのフォルダ構成による
# php artisan make:controller xxx/ModelName/ModelNameController --model=ModelName --api
今のプロジェクトはコマンドでプロジェクト標準テンプレートを入れてくれる
makeコマンドのカスタマイズ(laravel7.x以降)が入っている
■実行後のロールバックがうまくいかない時
1つずつ確認
1つだけロールバックする
# php artisan migrate:rollback --step=1
作り直し
全てのテーブルを作りなおし
# php artisan migrate:fresh
bootstrap-tableに関する話
stateが更新されているはずなのに、bootstrap-table内だと表示されない問題
①tableのColumns内に以下を設定しないといけない。
formatExtraData: { stateTest },
②渡す部分の並びや数の影響と、記述位置をformatter内にする
この渡す部分の並びや数も同じでないといけない→(col, row, rowIndex, formatExtraData)
const testFormatter = (col, row, rowIndex, formatExtraData) => {
const { stateTest } = formatExtraData;
formatter内に渡したデータを利用すればstateが使える
中かっこ{}は並び替えられるが、かっこ()は並びや数を同じにしないといけない
それもそうか。雰囲気でやってたからか・・・
■新しいMacのターミナル出力件数の設定
Ctrl + , で ユーザー設定 の settings.json を 表示
Terminal › Integrated: Scrollback
ターミナルがバッファーに保持する最大行数を制御します。
1000→100000
ターミナルの表示が多いと切れちゃって困る時に実施する
バージョンメモ
Swagger-PHP 2.0.16
Docker内に入る
# docker-compose exec php ash
Seeder実行(migrationリフレッシュ後にSeederも実行する場合)
# php artisan migrate:fresh --seed
Seeder実行(個別にSeederも実行する場合)
# php artisan db:seed --class=TestSeeder
ウィンドウのリサイズイベントが高頻度で発火するのでエラーが発生した時の話。
debounceテクニック使われてた。 const resizeObserver = new ResizeObserver(debounce(callback, 1000 / 60));速度改善に関して(バージョンにもよるんか?)
withが重い(毎回selectしているので)=わかる、確かに
→joinに変更
query()が重い(モデル内のquery記述によるもの)=それもあるのか、知らなかった
→selectにして必要な項目だけにした
Laravelでは with() を使うと、
モデルで定義したリレーションを使ってSQLが自動的に発行される
結果的に SQLを発行しているのと同じ動作
この子達のいる意味・・・
■問題箇所
$Human->number → SQL発行されない(取得できているから)
$Human->Credit->amount → SQL発行される(withの対象だから)
■対策
with→joinへ変更し、対象項目をselectで取得。
モデル箇所を配列で変数へ
$HumanArray = $Human->toArray()にして、
絶対にSQL発行しないようにする。
$HumanArray ["number"]
$HumanArray ["deposit_amount"] ←追加したselect項目
で取得する
■追加対策
条件(where)で絞り込み
#キュー用設定
QUEUE_DRIVER=sync
↓同期から変更
#キュー用設定
QUEUE_DRIVER=database
変更後に実施
php artisan cache:clear
非同期実行前に実施
php artisan queue:work
個別テスト
/var/www # ./vendor/bin/phpunit --version
/var/www # ./vendor/bin/phpunit tests/Feature/Test/SampleTest.php
グループ設定した部分のテスト
/var/www # ./vendor/bin/phpunit tests/Feature --group test --testdox
SampleTest.php
/**
* @group test
*/
class SampleTest extends TestCase
{
/**
* @testdox テストメモ
*/
public function testSample(){
}
}
さらに個別実施
/var/www # ./vendor/bin/phpunit tests/Feature/SampleTest.php --testdox --filter=testSample
githubのPRレビュー
チームコメント
「start a review」から投稿してください。
「start a review」から投稿したコメントにはスレッド形式で返信が書けるが、
「Add single comment」でコメントしてしまうとスレッド形式にならなくなってしまうため。
マージ後(事後)PRレビューの場合は
コメント(確認・問題ありません等)して「レビュー送信」
SQLのWithという選択肢を忘れがち
WITH main_tests_base AS (
SELECT ...
FROM main_tests
JOIN ...
WHERE ...
),
main_deposit_summary AS (
SELECT ...
FROM main_tests
WHERE ...
)
SELECT ...
FROM main_tests_base mt
LEFT JOIN main_deposit_summary md ON mt.id = md.credit_slip_id
パフォーマンスがどうなのか、気になるところではある・・・
パフォーマンス面の注意点
❶ 非インライン化される可能性
MySQL(8.0以降)などの一部のRDBMSでは、WITH句が一時テーブルとして評価されることがあります。
結果として:
WITH句の中身がメモリやディスクに一時保存される
必要以上にI/Oが増え、遅くなることがある
❷ インデックスが使われにくい場合がある
CTEが一時テーブル化された場合、元テーブルのインデックスが利用されず、フルスキャンになることも。
❸ 繰り返し参照時のコスト
同じCTEを複数回参照すると、毎回評価されるか、一時テーブルが繰り返し使われるかはDBエンジン依存。
(\)バックスラッシュ
option+¥
(`)バッククォート
Shift+@