0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

やりたかったこと

記事のタグ登録を実装中でした。
inputタグにスペース区切りで入力してもらって、それをタグとして登録するようにしています。
今回は編集画面を表示する際、以前登録したタグがinputタグに表示される、という実装を試みていました。
記事のインスタンスから、紐づいているタグを取得して、スペースで繋げた文字列にするヘルパメソッドを書きます。
(今回はコントローラ内に直接書いています)

最初のコード

最初の実装はこちら。

before
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に見せてみたところ、以下のようによりスマートな方法を教えてくれました。

after
private function tagsCollectionToString($tags) {
    return $tags->pluck('name')->implode(' ');
}

beforeのコードではtoArrayarray_columnといったPHPのメソッドを使っていました。afterでは、pluckという、Laravelのメソッドを用いています。これはコレクションに直接使えます。Readoubleはこちら
pluck(value, key)という形で使います。今回はkeyはいらないので、第一引数のみ書いています。
なお、pluckimplodeは空のコレクションに対しても安全に動作するため、事前にisEmptyなどでチェックする必要はないようです。

また他に、引数としてAriticleのインスタンスごと取るのではなく、コレクションを取るようにも修正が入りました。
そうすると、メソッドがより必要な情報だけを受け取れるようになり、疎結合になるというのが理由のようです。
editアクションでは以下のように、リレーションメソッドで取得できたコレクションを渡して使用します。

$input_selected_tags = self::tagsCollectionToString($article->tags);

感想

pluckは以前使ったことがありましたが、使い所で思い出すことができませんでした。自分で書けたと思っても、都度より良い書き方を模索し、いろんなメソッドを引き出しとして持っておけるようにしたいと思います。
また、引数には必要な情報だけ渡すという点も勉強になりました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?