やりたかったこと
記事のタグ登録を実装中でした。
input
タグにスペース区切りで入力してもらって、それをタグとして登録するようにしています。
今回は編集画面を表示する際、以前登録したタグがinput
タグに表示される、という実装を試みていました。
記事のインスタンスから、紐づいているタグを取得して、スペースで繋げた文字列にするヘルパメソッドを書きます。
(今回はコントローラ内に直接書いています)
最初のコード
最初の実装はこちら。
private function tagsToString($article) {
$selected_tags = $article->tags->toArray();
$selected_tag_names = array_column($selected_tags, 'name');
$input_selected_tags = implode(' ', $selected_tag_names);
return $input_selected_tags;
}
取得したタグはコレクション型なので、toArray
で配列にする
→array_column
でタグ名だけを取得
→implode
を使って半角スペースで連結
という手順でした。
改善後のコード
AIに見せてみたところ、以下のようによりスマートな方法を教えてくれました。
private function tagsCollectionToString($tags) {
return $tags->pluck('name')->implode(' ');
}
before
のコードではtoArray
、array_column
といったPHPのメソッドを使っていました。after
では、pluck
という、Laravelのメソッドを用いています。これはコレクションに直接使えます。Readoubleはこちら。
pluck(value, key)
という形で使います。今回はkey
はいらないので、第一引数のみ書いています。
なお、pluck
やimplode
は空のコレクションに対しても安全に動作するため、事前にisEmpty
などでチェックする必要はないようです。
また他に、引数としてAriticle
のインスタンスごと取るのではなく、コレクションを取るようにも修正が入りました。
そうすると、メソッドがより必要な情報だけを受け取れるようになり、疎結合になるというのが理由のようです。
edit
アクションでは以下のように、リレーションメソッドで取得できたコレクションを渡して使用します。
$input_selected_tags = self::tagsCollectionToString($article->tags);
感想
pluck
は以前使ったことがありましたが、使い所で思い出すことができませんでした。自分で書けたと思っても、都度より良い書き方を模索し、いろんなメソッドを引き出しとして持っておけるようにしたいと思います。
また、引数には必要な情報だけ渡すという点も勉強になりました。