Posted at

Laravel5.8.4で追加されたCollectionのjoinメソッド

Laravel 5.8.4がリリースされたので変更点を確認。

Collectionにjoinメソッド追加したよ的な記述があったので、implodeのaliasかなと思ったのですがコードをみるとちょっと挙動が違う。

確認したのでメモです。

まずはシンプルなコレクションを用意

>>> $collection = collect([1, 2, 3, 4, 5]);

=> Illuminate\Support\Collection {#3141
all: [
1,
2,
3,
4,
5,
],
}

,で繋げてみる。これは両方同じ

>>> $collection->implode(', ');

=> "1, 2, 3, 4, 5"
>>> $collection->join(', ');
=> "1, 2, 3, 4, 5"

joinではもうひとつ引数を追加できる。日本語だと使いどころが無さそう気がする。

>>> $collection->join(', ', ' and ');

=> "1, 2, 3, 4 and 5"
>>> $collection->join('と', 'そして');
=> "1と2と3と4そして5"

ちょっと複雑なコレクションを用意

>>> $collection = collect([

... ['account_id' => 1, 'product' => 'Desk'],
... ['account_id' => 2, 'product' => 'Chair'],
... ['account_id' => 3, 'product' => 'Hoge'],
... ]);
=> Illuminate\Support\Collection {#3168
all: [
[
"account_id" => 1,
"product" => "Desk",
],
[
"account_id" => 2,
"product" => "Chair",
],
[
"account_id" => 3,
"product" => "Hoge",
],
],
}

implodeだと抜きだすキーを指定できますが、joinはできません

>>> $collection->implode('product', ', ')

=> "Desk, Chair, Hoge"
>>> $collection->join('product', ', ')
PHP Notice: Array to string conversion in ...

joinでやるならpluckメソッドと組み合わせてこんな感じ

>>> $collection->pluck('product')->join(', ')

=> "Desk, Chair, Hoge"
>>> $collection->pluck('product')->join(', ', ' and ')
=> "Desk, Chair and Hoge"

join追加されましたがimplodeのaliasでは無いってことと使い所は無いかもってことがわかりました!