はじめに
自分が理解できていない部分を整理しながら、知識を少しずつ深めていくことを目的にこのブログを書いています。
そのため、内容の中には誤りが含まれている可能性もありますが、その点はご容赦ください。
間違いなどがあれば、ぜひコメントなどで教えていただけると嬉しいです!
今日整理していく内容
- Eloquentの「キャスト(casts)」
- N+1問題と
with()
メソッド - PHPアロー関数
Eloquentの「キャスト(casts)」
この言葉を初めて聞いたとき、「キャストって何?」と頭の中が一瞬混乱したことを覚えています。調べてみると「データ型を自動で変換する仕組み」ということがわかり、少しずつ理解が進みました。
参考
Eloquentでは、モデルの casts()
メソッドで属性と型を定義することができます。これにより、データベースとの入出力時に自動で型変換が行われます。
代表的なキャスト型:boolean
, integer
, float
, decimal:2
, array
, object
, collection
, date
, datetime
, encrypted
, hashed
, クラス系(AsArrayObject
など)
class User extends Model
{
protected function casts(): array
{
return [
'is_admin' => 'boolean',
'options' => 'array',
];
}
}
このコードでは、「is_admin
を真偽値として、options
を配列として自動的に扱えるようにする設定」をしています。
属性名 | キャスト型 | 動作 |
---|---|---|
is_admin |
boolean |
0/1 ⇔ true/false 自動変換 |
options |
array |
JSON文字列 ⇔ PHP配列 自動変換 |
N+1問題と with()
メソッド
これも初めて見たとき、「N+1って数学の話?」と戸惑いました。実務でいきなり遭遇することが多いので、混乱する人も多いと思います。
参考
N+1問題とは、関連データをループ内で都度読み込むことによって、クエリが大量発行されてしまう現象のことです。
例として、100件程度のデータであれば問題ないのですが、2000件を超えるような場合には、APIやLambda関数でタイムアウトが発生することもあります。
この問題を解消する方法が with()
メソッド です。関連モデルを「事前にまとめて取得」することで、クエリの数を大幅に減らすことができます。
$books = Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
このコードでは、Book
モデルに定義された author()
リレーションを事前にロードしています。つまり、「一括でまとめて取得しておく」ことで、N+1問題を回避しているというわけです。
実際に遭遇してみると、その効果を強く実感できます。
PHPアロー関数
最後は、ちょっとスタイリッシュな書き方「アロー関数」についてです。
参考
アロー関数は、短く書ける無名関数(匿名関数)のことで、PHP 7.4で追加された構文です。従来の function
を使う書き方よりもシンプルで読みやすいのが特徴です。
基本の構文は次の通りです。
fn (引数) => 式;
この形を覚えておけば、コードを読んだときに「何をしているか」を感覚的に理解しやすくなります。
以下は、通常の無名関数との比較です。
// 通常の無名関数
$add = function ($x, $y) {
return $x + $y;
};
// アロー関数
$add = fn ($x, $y) => $x + $y;
確かにアロー関数の方がシンプルで、処理の意図が一目でわかりますね。とはいえ、慣れないうちは少し掴みにくい部分もあるかもしれません。
まとめ
ここまで読んでいただきありがとうございました!
今回の記事では、
- Eloquentのキャスト(casts)
- N+1問題と
with()
メソッド - PHPのアロー関数
について整理しました。
自分の中で「なんとなくわかっているつもり...」だった部分を改めて言語化してみると、まだ理解が浅いところが多いと実感しました。
少しずつでも前進できるよう、これからもドキュメントをしっかり読みながら理解を深めていきたいと思います!
明日も頑張ります!💪