CakePHPでテーブルデータをCSVとしてダウンロード
エラーチェック等は入れてません
Controller
//適当にフォームからDLするテーブル名を送る
$selectTable = $this->request->data['selectTable'];
//モデルをロード
$this->loadModel($selectTable);
//テーブルのカラム名を取得
$tableType = $this->$selectTable->getColumnTypes();//テーブルデータを取得※1
$tableData = $this->$selectTable->getAll();
//CSVの先頭行(カラム名)のために整形
$columnName = array();
foreach($tableType as $key => $value){
$columnName = $key;
}//CSV出力※2
self::csvSet($columnName, $tableData, $selectTable);
※1 MODEL内のデータ取得のメソッド
public function getAll(){
$sql = "SELECT * FROM テーブル名";
$tableData = $this->query($sql);
$returnData = array();//データの整形
foreach($tableData as $data){
$returnData = $data[テーブル名];
}
return $returnData;
}
※2 csvSetメソッド
public function csvSet($columnName, $datas, $name = 'csv'){
//自動選択のテンプレートを使わない$this->layout = false;
//ファイル名の設定
$filename = $name."_".date('YmdHis');
// テンプレートにセット
$this->set('fileName', $filename);
$this->set('th', $columnName);
$this->set('td', $datas);//テンプレート呼び出し※3
$this->render('/Layouts/csv');
}
※3 CSV出力のテンプレート(View/Layouts/csv.ctp)
<?php
$this->Csv->addRow($th);
foreach($td as $t) {
foreach($t as $tData){
$this->Csv->addField($tData);
}
$this->Csv->endRow();
}$this->Csv->setFilename($fileName);
echo $this->Csv->render(true, 'sjis', 'utf-8');
exit;