アーカイブ

‘cakePHP’ タグのついている投稿

cakePHP覚書#4

2010 年 3 月 4 日 Jiro コメントはありません

ひとつのモデルの中で関数を作成して簡単に利用したいと思ったのですが、結果を返す際に
他のモデルも参照しなくちゃいけなくなりました。
このあたりは、アソシエーションを使ったほうが良いのかもしれませんが、データベースの作成がまずくて
うまく出来そうに無いので、モデル内の関数で他のモデルを呼び出して見ました。

$this->loadModel('ModelA');

これは、やはりダメでした。

importでmodelを呼び出して使うみたい。

App::import('Model','modelA');
$modelA = new modelA;
$modelA->find($conditions,null,$orders);

こんな感じでいいようです。さて今から検証。

検証の結果うまくいきました。上記App::import(‘model’と小文字になっていたところを訂正。

モデルの中で他のモデル呼び出すって、ちょっと邪道かなという気もします。

componentあたりに関数作成したほうがいいかもしれませんね。

また、コントローラの中でusesでたくさんのモデル定義していると使わなくてもSQLが走っているようです。

基本になるモデルひとつだけusesで定義しておくか、$uses=null;にしておいて、必要なアクションで必要なモデルを

loadModelしたほうが良い気がしますね。

まだパフォーマンスを上げる段階ではないですが、一通り動作するようになれば、次はパフォーマンス向上が大事だと思います。

現在はWindowsXPの非力なマシン上でXampp環境でのテストですが、ファンが唸ってますからねw

本番では随分昔のDellサーバーに乗せる予定です。こっちも非力ですからね。

カテゴリー: cakePHP タグ: ,

jQuery書籍購入

2010 年 3 月 4 日 Jiro コメントはありません

たまたま、本屋に行く機会があったのでちょっと立ち読みしてたらjQueryの本を見つけました。

基本的な使い方はWebで調べると色々出てくるのですが、この本はサンプル集が多くて「メニュー」「グリッド」「ツールチップ」などが

掲載されていたので思わず購入してしまいました。

プラグインの使い方はWebで調べるの結構面倒なんですよね。まあ、例に漏れずすべてのプロパティやアクションを紹介している

わけではないのですが、とりあえず使ってみるきっかけにはいいですよね。

それに、度忘れしちゃうことが多いので、さくっと引いてみて「ああ、そうだった。」って感じで使ってます。

カテゴリー: cakePHP タグ: , ,

cakePHP覚書#3

2010 年 3 月 2 日 Jiro コメントはありません

連想配列(modelの内容をDBからとってきたもの)の配列。要は複数レコードを入れた配列なんですが、

foreachで回して、項目を変更したのだけど、元の配列自体に変更が及んでいないようで、その後saveAllしても

DBに反映されていない。

for文で直接もとの配列を書き直してみよう。

foreach ($bs as $b){
	$b['model']['data'] = "test";
}

こういう風にすると「$bs」のなかみ$bs[0]['model']['data']は書き換えられなかった。

for ($i=0;$i<count($bs);$i++){
	$bs[$i]['model']['data']="test";
}

こうしたらうまく書き換えてくれた。

findなどでデータベースのレコードを取得する場合の条件の書き方でくだらないミス。

$conditions = array('nenrei>' => $nenrei);

フィールド名と比較演算子の間のスペース忘れると変なことになる。

where 'nenrei>' = 1

比較演算子がフィールド名の一部と誤認識される。つーか、空白で区切らないと当たり前のことですね。ww

カテゴリー: cakePHP タグ: ,

cakePHP覚書#2

2010 年 3 月 1 日 Jiro コメントはありません

ちょっと複雑なデータ更新が必要になってきたので、トランザクションを調べることにした。

ひとつのテーブルで更新と追加が同時発生、他のテーブルでも同様という風に二つのテーブルにまたがる処理ですが

アソシエーションでは定義できないようなもの。

まずMySQLのテーブルがMyISAMだとロールバックしても効かないので使えない。InnoDBに変更が必要となる。

show table  status;

で現状の確認をする。MyISAMで作っている既存テーブルもInnoDBに変更可能。

変更するには、phpMyAdminであればテーブルの「操作」で「ストレージエンジン」を「InnoDB」に変更して実行押すだけ。

alter table 'xxxx'  engine=InooDB;

が実行された。もちろんコマンドラインから、これを打ってもOKです。

さてさて、begin()  commit()  rollback() をどこで定義しておくか。

必要なテーブルのモデルだけで定義しておいてもいいけど面倒ですね。思い切ってapp_modelに書いとけば全部のモデルで継承してくれますから、これでいいかな。

いつものように、cake以下は触らないお約束で、cake/libs/modelのなかのapp_model.phpをapp/models以下にコピーしておいて追加します。

function begin() {
	$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
	$dbs->begin($this);
}

function commit() {
	$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
	$dbs->commit($this);

}

function rollback() {
	$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
	$dbs->rollback($this);

}

これで、モデルの関数になるのでモデル名->begin()とかで使えます。

2つのモデルを同時更新なら

	ModelA->begin();

	ModelB->begin();

	処理ほにゃらら

	なんか問題あったら

	ModelA->rollback();

	ModelB->rollback();

	エラー無く終了。

	ModelA->commit();

	ModelB->commit();

こんな具合かな。それとsavaAllを使うときの注意もあった。saveAllの外側でトランザクション開始していてもループの途中でコミットされちゃうみたいです。対策としてはパラメータを追加しておくこと。

ModelA->saveAll($datas ,array('atomic'=>false);

こんなおまじないが必須だ。

追記:どうもModelA ModelB両方にbegin() rollback() commit()を行わなくても、ModelAだけやっておけば、両方に効力があるという記述を発見。まだ未検証です。

追記:検証しました。

実行されたSQLも確認しましたが、どれかひとつのモデルでトランザクション操作しておけばOKです。


カテゴリー: cakePHP タグ:

cakePHP覚書

2010 年 2 月 28 日 Jiro コメントはありません

テーブルに追加しておいたcreatedとmodifiedの項目。

これらの項目を追加しておくと自動的に追加した際と更新した際にタイムスタンプが登録されるはずなのだが

modifiedの更新日時が書き換えられていない。スペルを間違ってるのかなと心配になりググって見たら

cakePHP1.2からはmodifiedの項目はdefault Nullにしていないと更新されないようなのでテストしてみる。

うまく動作しました。ただdefault値をヌルにしたらSQLエラーで怒られたけど、よく見たらヌルを許可してなかっただけでした。

カテゴリー: cakePHP タグ:
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

Bad Behavior has blocked 12 access attempts in the last 7 days.