CakePHP

【CakePHP2.4】発行されているSQLをコンソールから確認する方法。

CakePHPにてSQLを確認する方法は、ブラウザ上からデバッグキットを用いるか、sql_dumpの欄を見る方法がある。

ではコンソールから見たい場合はどのように取得すればいいのか?

ということで調べてみた。

■モデルから

$log = $this->getDataSource()->getLog();
var_dump($log);

■コントローラーから

$log = $this->Model->getDataSource()->getLog();
var_dump($log);

というように、getDataSouce()メソッドを用いることでSQLを取得することが出来た。

 

【CakePHP2.4】find()で複数のOR条件をANDで結合したいときの書き方。

めも。

$conditions = array(
	$this->alias.'.col1' => 'value_1',
	$this->alias.'.col2' => 'value_2',
	
	'OR' => array(
		array($this->alias.'.col3 LIKE' => '%value_3%'),
		array($this->alias.'.col3 LIKE' => '%value_4%'),
	),
	'AND' => array(
		'OR' => array(
			array($this->alias.'.col4' => 'value5'),
			array($this->alias.'.col5' => 'value6')
		)
	)
);

 

【CakePHP2.4】saveAll()メソッドでINSERT文を分割させたくない場合。

AppModelに下記独自関数を定義する。


App::uses('Sanitize', 'Utility');

class AppModel extends Model {
	
	public function saveAllAtOnce($data) {
		if(count($data) > 0 && !empty($data[0])) {
			$data = Sanitize::clean($data);
			$value_array = array();
			$fields = array_keys($data[0][$this->name]);
			foreach ($data as $key => $value) {
				$value_array[] = "('" . implode('\',\'', $value[$this->name]) . "')";
			}
			$sql = "INSERT INTO " . $this->table . " (" . implode(', ', $fields) . ") VALUES " . implode(',', $value_array);
			$this->query($sql);
			return true;
		}
		return false;
	}
	
}

この関数に下記のような構造のデータを渡せば、一度のインサート文で複数レコードを一括登録してくれるのでsaveAll()メソッドを使うよりも処理が速くなる。

array(
	0 => array(
		'ModelName' => array(
			'Field1' => 'value',
			'Field2' => 'value',
			'Field3' => 'value',
			'Field4' => 'value',	
		)
	),
	1 => array(
		'ModelName' => array(
			'Field1' => 'value',
			'Field2' => 'value',
			'Field3' => 'value',
			'Field4' => 'value',
		)
	)	
)

これはかなり便利。

 

【CakePHP】ファイル名とクラス名が異なるファイルをインポートする方法。

ファイル名、クラス名が一致している場合は「App::uses()」を用いてクラスの読み込みを行っていたが、それらが異なる場合はうまく読み込めず頓挫していた。
しかし「App::import()」を用いることで上手に読み込めることが確認できたのでメモ。

例えば「app/Vendor」にライブラリを設置したとすると、読み込み方は下記の通り

App::import('Vendor', 'ClassName', array('file' => 'PATH'.DS.'TO'.DS.'CLASSFILE'.DS.'hoge.php'));

公式ドキュメントは下記を参照↓

http://book.cakephp.org/2.0/ja/core-utility-libraries/app.html#vendor

これで正しくインポートが行える。

 

【CakePHP2.4】CakePHPで動的にDBの接続先を変更する。

めも。
モデルごとにDBの接続先を変更したい時に便利。

まずは「app/Config/database/php」に接続情報の追加を行う

class DATABASE_CONFIG {

	public $default = array(
			'datasource' => 'Database/Mysql',
			'persistent' => false,
			'host' => '',
			'login' => '',
			'password' => '',
			'database' => '',
			'prefix' => '',
			'encoding' => 'utf8',
	);

	// 追加のDB接続情報
	public $hoge = array(
			'datasource' => 'Database/Mysql',
			'persistent' => false,
			'host' => 'xxxx',
			'login' => 'xxxx',
			'password' => 'xxxx',
			'database' => 'xxxx',
			'prefix' => '',
			'encoding' => 'utf8',
	);

}

次にモデルにてDBの接続先情報を指定する。

class Example extends AppModel {
	
	public $useDbConfig = 'hoge';
	
}

これでモデルの接続先DBを動的に変更することが出来る。

めっちゃ便利だね。

 

【Javascript, PHP】CakePHP2.4のセキュリティコンポーネントをAjaxによるPOSTデータで通過させる。

メモ。

var data = {};
$(this).find('input[type!="submit"]').each(function() {
	data[$(this).attr('name')] = $(this).val();
});

上記のようにして特定フォームの全インプット要素(Submit属性は除く)を拾ってポストすればセキュリティコンポーネントを通過することが出来る。
しかし、セキュリティトークンは一度の処理のみ有効なので連続してポストした場合、2回目以降が403で弾かれてしまうので注意されたし。

また上記の拾い方をした場合、コントローラー内からは通常通り「$this->request->data」で受け取ることができるので非常に便利。

 

【CakePHP2.X】namespaceが使われた外部クラスの読み込み。

めも。

1, ロードしたいクラスファイルを「/app/Vendor」以下に配置。

2, 「bootstrap.php」に下記を記述

spl_autoload_register(function($class) {
	foreach(App::path('Vendor') as $base) {
		$path = $base . str_replace('\\', DS, $class) . '.php';
		if(file_exists($path)) {
			return include $path;
		}
	}
});

 

【CakePHP2.4】クエリストリングを生成する。

めも。

$q = array(
	'hoge' => 'foo',
	'piyo' => 'var',
	'fuga' => 'baz'
);
var_dump(Router::queryString($q));

↓

string(27) "?hoge=foo&piyo=var&fuga=baz"