新しいフォルダー

気になったことや勉強したことについて書いていきます

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;