【CakePHP3】toArray()とtoList()の挙動の違い

Bake-with-CakePHP Logo

CakePHP3でResultSetやCollectionにしたデータを配列に変換する際、基本的にはtoArray()を使うことが多いと思うが、時としてtoList()を使っている箇所もある。果たして両者の違いは何なのか調べてみた。検証したCakePHPのバージョンは3.6.13。

toArray()はキーを保持し、toList()はキーを振り直す

結論から書くと、

  • toArray():キーを保持した状態で配列を返す
  • toList():キーを連番で振り直した状態で配列を返す

という違いがある。例えば

というコードがあったとしよう。デバッグ結果は下記のようになる:

toArray()とtoList()の使い分け

基本的にはtoArray()でほぼ事足りる。ORMからDBへselect文を投げた後にレコードをEntityとして変換して取得できるResultSetでは、そもそもキーが連番で生成されるため、toArray()でもtoList()でも結果は変わらない。簡単に再現すると下記になる:

だが、何らかのデータをCollectionに手動追加した時には挙動が変わる。例えば下記:

この場合にはtoList()を使うのが適切だと分かる。

ただし、上記においてはappendItem()で第2引数に適切なキー番号を指定すればその限りではない:

が、後から追加したデータのキーを直接指定する機会はあまり無いと思うので、結局はappendItem()もしくはprependItem()とtoList()の併用が最も活用頻度が高いと思われる。

 

参考)

https://book.cakephp.org/3/ja/core-libraries/collections.html#id12