一括新規登録 | 一意フィールド指定型

複数行からなるデータを一括登録する。
ただし、指定したフィールドの値で重複があれば、その行の登録はしない。
重複とは、登録するフィールド値がDB側のフィールドに既に存在する状態のこと。
	/**
	 * 一括新規登録 | 一意フィールド指定型
	 * 
	 * 複数行からなるデータを一括登録する。
	 * ただし、指定したフィールドの値で重複があれば、その行の登録はしない。
	 * 重複とは、登録するフィールド値がDB側のフィールドに既に存在する状態のこと。
	 * 
	 * @param array $data recs用のデータ
	 * @param string $unique_field 一意フィールド
	 * @return レスポンス 
	 *  - dbRes saveAllのレスポンス
	 *  - regCnt 登録件数 : 実際に登録したデータの行数
	 */
	public function regUfAtOnce($data,$unique_field){
		// データから一意フィールドの列を、一意リストとして抜き出す。
		$ul=Hash::extract($data, '{n}.'.$unique_field);
		

		// 一意リストから重複調査SQL文を作成および実行し、重複リストを取得する。
		$fields=array($unique_field);
		$conditions=array(
				array($unique_field => $ul),
		);
		$option=array(
				'fields'=>$fields,
				'conditions'=>$conditions,
		);
		$overList=$this->find('list',$option);


		// データから重複リストに該当する行を除去する。(重複分の除去)
		$data2 = array();
		$regCnt=0;//登録行数
		if(empty($overList)){
			$data2 = $data;
			$regCnt=count($data);
		}else{
			foreach($data as $ent){
				$uv = $ent[$unique_field];
				$flg=in_array($uv,$overList);
				if($flg==false){
					$data2[] = $ent;
					$regCnt++;
				}
			}
		}
		
		// DBへ保存する
		$dbRes=null;
		if(!empty($data2)){
			$this->begin();//トランザクション開始
			$dbRes = $this->saveAll($data2);//複数行をまとめて削除
			$this->commit();
		}
		
		$res=array(
				'dbRes'=>$dbRes,
				'regCnt'=>$regCnt,
		);
		
		return $res;
	}
	


週の集計データを取得する

指定した日付の週の集計データを取得する。
週始めはデフォルトで日曜日。オプションで月曜日を週始めにすることもできる。





CakePHPのバージョンを確認する方法

	<?php echo Configure::version(); ?>



FormHelperの拡張 | オリジナルヘルパー

オリジナルヘルパーでFormオブジェクトの機能を使いたい場合、 FormHelperを継承してオリジナルヘルパーを作成する。
基本的に通常オリジナルヘルパーと使い方や登録方法は同じである。

オリジナルヘルパー

app/View/Helper に配置する。

	App::uses('FormHelper', 'View/Helper');
	
	class HogeHelper extends FormHelper {
	
		private $_mdl=""; // モデル名
		
		public function setModelName($modelName){
			$this->_mdl = $modelName.'.';
		}
	
		public function inputKjId($fields){
	
			echo "<div class='hoge_div'>¥n";
			echo $this->input($this->_mdl.'hoge_id', array(
					'id' => 'hoge_id',
					'value' => $fields['hoge_id'],
					'type' => 'text',
					'label' => false,
					'placeholder' => '-- ID --',
					'style'=>'width:100px',
					'title'=>'IDによる検索',
			));
			
			echo "</div>¥n";
					
		}
	
	}
	

オリジナルヘルパーの使用設定

コントローラにてオリジナルヘルパーを使用設定する。

	class AnimalController extends AppController {
	
		public $name = 'Animal';
		public $uses = array('Animal');
		
		/// オリジナルヘルパーの登録
		public $helpers = array('Hoge');
		
		...
	

オリジナルヘルパーの使用例

View内のctpファイルにてオリジナルヘルパーを使用する。

	<h2>ネコ</h2>
	HelloWorld<br>
	<?php 
	echo $this->Form->create('Animal', array('url' => true ));
	$this->Hoge->setModelName('Animal');// モデル名をセット
	
	$this->Hoge->inputKjId($fields);// オリジナルヘルパーを使用する
	?>
	
	



データベース名を指定して、DBを動的に切り替える

コントローラ


	<?php
	App::uses('AppController', 'Controller');
	
	class Test2Controller extends AppController {
		public $name = 'Test2';
		public $uses=null;
	
		public function change_db(){

			$dbName = "hoge_db"; // ← 切り替えるデータベース名
			App::uses('DbChg','Model');
			$dbChg=ClassRegistry::init('DbChg');
			$dbChg->changeDbName($dbName);
			$res = $dbChg->query("SELECT * FROM  animals");
			debug($res);
		}
	}
	

モデル


	<?php
	App::uses('Model', 'Model');
	
	class DbChg extends Model {
		public $useTable = false;
	
		// データベース名を指定して、DB変更する。
		public function changeDbName($dbName,$DbConfig='default') {
			$this->setDataSource($DbConfig);
			$db = ConnectionManager::getDataSource($this->useDbConfig);
			$db->reconnect(array('database' => $dbName));
		}
		
	}
	

参考サイト



各テーブルで共通するフィールドをセットする | setCommonToEntity

各テーブルで共通するフィールドである、更新ユーザー、ユーザーエージェント、IPアドレス、生成日時、更新日時をセットするサンプル。
更新日時はDBの自動入力を前提にしているので除去している。


	    // 更新ユーザーなど共通フィールドをセットする。
	protected function setCommonToEntity($ent){
		
		// 更新ユーザーの取得とセット
		$update_user = $this->Auth->user('username');
		$ent['update_user'] = $update_user;
		
		// ユーザーエージェントの取得とセット
		$user_agent = $_SERVER['HTTP_USER_AGENT'];
		$user_agent = mb_substr($user_agent,0,255);
		$ent['user_agent'] = $user_agent;
		
		// IPアドレスの取得とセット
		$ip_addr = $_SERVER["REMOTE_ADDR"];
		$ent['ip_addr'] = $ip_addr;
		
		// idが空(新規入力)なら生成日をセットし、空でないなら除去
		if(empty($ent['id'])){
			$ent['created'] = date('Y-m-d H:i:s');
		}else{
			unset($ent['created']);
		}
		
		// 更新日時は除去(DB側にまかせる)
		unset($ent['modified']);
		
		
		return $ent;
		
	}
	


テーブル名からモデル名に変換

ソースコード

	$table_name = "big_animals";
	$modelName = $this->convTableToModelName($table_name);
	debug($table_name);→'BigAnimal'

	/**
	 * テーブル名からモデル名に変換する
	 *
	 * @note
	 * 例 big_animals → BigAnimal
	 *
	 * @param string $table_name テーブル名
	 * @return モデル名
	 */
	private function convTableToModelName($table_name){
		$str = strtr($table_name, '_', ' ');
		$str = ucwords($str);
		$str =  str_replace(' ', '', $str);
		$str = mb_substr($str,0,mb_strlen($str)-1);
		return $str;
	}
	


モデル名からテーブル名に変換する

ソースコード

	$modelName = "BigAnimal";
	$table_name = $this->convModelToTableName($modelName);
	debug($table_name); // → 'big_animals'

	/**
	 * モデル名からテーブル名に変換する
	 * 
	 * @note
	 * 例 BigAnimal → big_animals
	 *
	 * @param string $modelName モデル名
	 * @return テーブル名
	 */
	private function convModelToTableName($modelName){
		$str = preg_replace('/[A-Z]/', '_¥0', $modelName);
		$str = strtolower($str).'s';
		return ltrim($str, '_');
	}
	


favicon.icoをCakePHPで設定する方法

favicon.icoをwebrootの直下に配置する。
defaut.ctpのhead要素内に下記コードを記述する。
	<?php echo $this->html->meta('icon'); ?>

favicon.icoの作成は以下のサイトがおすすめ
Favicon Generator. For real.



ログファイルの容量制限とローテーションを設定する

ログが容量制限(size)に達した場合、ログファイル名はタイムスタンプをつけた名前に変更され、新しいログファイルが作成される。
この一連の処理はログファイルのローテーションと呼ばれる。
ローテーションに回数制限(rotate)をかけることができる。
回数制限を超えると古いログファイルは削除される。
bootstrap.phpからsizeとrotateを設定できる。

bootstrap.php


	CakeLog::config('debug', array(
		'engine' => 'FileLog',
		'types' => array('notice', 'info', 'debug'),
		'file' => 'debug',
		'size' => '16MB', // デフォルトは10MB
		'rotate' => 10, // デフォルトは10(回)
	));
	CakeLog::config('error', array(
		'engine' => 'FileLog',
		'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
		'file' => 'error',
		'size' => '16MB',
		'rotate' => 10,
	));
	
ログファイル
参考