LoginSignup
0
0

俺のLaravel

Last updated at Posted at 2022-05-11

LaravelのTipsを書き溜めていく。

テクニック系

子でループせず孫の情報を直接取得したい

pluck メソッドと collapse メソッドを使用して、子のコレクションを取得し、それを一つのコレクションに結合することで、子の要素をループせずに孫の要素にアクセスすることができます。

孫の要素をユニーク化して取得

例)会社の社員の持ってる携帯種類を一覧化したいときとか

$company->staffs->pluck('phones')->collapse()->unique('type');

更新日時が最も新しい孫を1つ取得

$company->staffs->pluck('phones')->collapse()->sortByDesc('updated_at')->first();

バリデーションrequiredだけどnullableにしたい

present という便利なルールがあるのでこれを使う。

present自体は空を許容するが、他ルールとセットで使う場合はnullableも指定すればOK!

present|nullable|string

実行されたSQLを確認したい

方法1. dddで出力

webの場合お手軽で便利。
引数必要なので適当に ddd('a') などでOK。

方法2. enableQueryLogを使う

確認したいSQLの前後に記述する

\DB::enableQueryLog();
処理
dd(\DB::getQueryLog());

方法3. toSqlを使う(laravel9の場合)

eloquentの関数。ワンライナーで書けてよさそう
dd($model->toSql(), $model->getBindings());
参考: https://codelikes.com/confirm-laravel-sql/#toc1

sortいろいろ

Resource内でSQL発行してないか確認する

N+1問題とか起きがち。

Controller
return new HogeResource(['fuga' => $fuga]);

Controller
// return new HogeResource(['fuga' => $fuga]);
\DB::enableQueryLog();
new HogeResource(['fuga' => $fuga])->toArray($request);
print_r(\DB::getQueryLog());exit;

スラッシュを含むURLパラメータを取得したい

http〜/hoge/aa/bb/c.jpg?123
のとき aa/bb/c.jpg の部分をパラメータとして取得したい。

誤)これだと404エラーになる
Route::get('hoge/{file_path}', 'HogeController@index');
正)whereで正規表現でスラッシュ含む形にしてあげればOK(?以降は含まれない)
Route::get('hoge/{file_path}', 'HogeController@index')->where('file_path', '(.*)');

ポリモーフィックリレーションでリレーション先のモデルが存在しないものは取得対象外にしたい

挙動注意系

ExistsバリデーションでEloquent使う際の落とし穴

image.png

eloquentを使うことでテーブル名を直接書かなくて済む
ただしexistsはeloquentのスコープ使えない
deleted_atも見ない
グローバルスコープも効かない
うーん。。

テストコード assertModelExists

idだけの比較で各カラムの値まではチェックしてくれない。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0