PHP

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

めも。

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

↓

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

 

【CakePHP2.4】よくつかう環境変数まとめ。

めも

・APP
/home/…/app/

・APPLIBS
/home/…/app/Lib/

・CAKE_VERSION
例)2.4.2

・WWW_ROOT
/home/…/app/webroot/

・CSS
/home/…/app/webroot/css/

・IMAGES
/home/…/app/webroot/img/

・JS
/home/…/app/webroot/js/

 

【CakePHP2.4】Jsonヘッダーを送出する。

めも。

コントローラーにて。

$this->response->type('application/json');
$this->response->send();

 

【CakePHP2.4】指定したフォルダの内容を取得する。

めも。

App::uses('Folder', 'Utility');
$folder = new Folder('/path/to/dir');
$contents = $folder->read();

返却される配列の[0]番目にディレクトリが格納され、[1]番目にファイルリストが格納される。

 

【CakePHP2.4】ファイルをダウンロードさせる。

めも。

コントローラーにて。

$this->response->file('/path/to/file');
$this->response->send();

 

【CakePHP】Model::create()のメモ。

Model::create()を行った際、プライマリーキーを除いた全てのカラムに設定されている初期値がセットされる。
そのためレコード更新の時、初期値が設定されているカラムの値をセットせずにModel::create()、Model::save()を行うと、意図した動作にならない場合があるので注意。

具体例として、statusなどのカラムを初期値1で設定しており、どこかのタイミングで2に書き換わっていたとする。そしてそのレコードを編集する際にステータスも「2」であると明示的にセットしない限り、修正完了した時点でステータスは1に戻ってしまう。

ということである。

IDさえセットしてしまえば、他の渡されなかった値はDBのレコードをそのまま維持してくれると勘違いしていたが違った模様。

ちなみにコアコードは下記のようになっている。

public function create($data = array(), $filterKey = false) {
	$defaults = array();
	$this->id = false;
	$this->data = array();
	$this->validationErrors = array();

	if ($data !== null && $data !== false) {
		$schema = (array)$this->schema();
		foreach ($schema as $field => $properties) {
			if ($this->primaryKey !== $field && isset($properties['default']) && $properties['default'] !== '') {
				$defaults[$field] = $properties['default'];
			}
		}

		$this->set($defaults);
		$this->set($data);
	}

	if ($filterKey) {
		$this->set($this->primaryKey, false);
	}

	return $this->data;
}

10行目でおもいっきり初期値セットしてるがな。

 

【PHP】array_diff()の挙動まとめ。

めも。

array_diffは与えた配列全てにおいてプライマリーな値を返却するのではなく、あくまでも第1引数に与えた配列内に存在している値のみを返却するという点に注意。
たとえば下記のような処理を行った場合、結果は以下の通りとなる。

$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$b = array(6, 7, 8, 9, 10, 11, 12, 13, 14, 15);

$c = array_diff($a, $b);

↓

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}

ここで期待していた結果は両配列の差分である「1,2,3,4,5」に「11,12,13,14,15」を加えたものであったが、どうやら第一引数が所有している値のみを返却する模様。array_diff()を用いた後に、array_intersect()などで、どちらか一方の配列に含まれていることを保証させるような処理を書く必要がないことを今更ながら学んだ。

今回の件はむしろこの挙動であってくれたほうが都合が良かったが、今後嵌りそうなTIPSとして覚えておこう。

 

【CakePHP】モデルでSQLを直接実行する。

めも。

特殊なSQLをフレームワーク側に組み立てさせるのがめんどくさい場合とかあるよね。

Model::query()メソッドを用いる。

モデルクラスにて。

$sql = '任意のSQL';
$res = $this->query($sql);

まぁモデルのメソッドを使って生成出来ないSQLは滅多に存在しないのでなるべくなら規則に従ったほうが良い。