CakePHPでCSVを扱うメモ

投稿者: | 2018-02-15

概要

タイトル通りです。今回はプラグインを導入してCSVを出力させることを試みます。

CsvViewプラグイン導入

手順自体は参考通り。

Composerを利用して導入。

$ composer require friendsofcake/cakephp-csvview:~3.0

config/bootstrap.phpに以下を追加。

Plugin::load('CsvView');

定数とDBから引っ張ってきたデータを同一列に書き込みたい場合

$_extractにカラム指定をすれば、$_serializeで指定したqueryから引っ張ってきたカラムを取捨選択・加工してCSVにすることができる。この時、無名関数を渡すこともできるので、それを利用して値を返したりすることができる。例えば、特定カラムの値を参照して定数を出力してあげたい(かつ扱うDBが持つテーブル群がその定数を保持していない)場合に嬉しい。これは、各レコードが関数に渡されて実行されるので、全レコードがその検査を受けることになる。試してないけどこの時渡されるのはEntityなんだろうか。

php
$_extract = [
'id',
function ($row) {
if($row['code'] === '山') {
return '川';
} else {
return '';
}
},
// 以下固定値
function () {
return '096';
},
'created'
];

0落ちあれこれ(おまけ)

定数とDBから〜では’096’をCSVに差し込むように処理しているが、このCSVをExcelなどで開くと、設定にもよるが先頭の0は表示してくれない。96になる。CSV自体をテキストエディタなどで開くと096が入っており、内部的には問題ないが、もしどうにかして(手動でExcel等の設定をいじらずに)表示させたい場合には以下のようにすると一応出るようになる。
php
$_extract = [
// 以下固定値
function () {
return '="096"';
},
];

ただし文字列扱いなのでデフォルトでは左寄せになる。正直実用性の怪しい小技レベル。

参考

Qiita CakePHPのCsvView プラグインでお手軽CSV出力
Github cakephp-csvview