CakePHPでデータ削除

この記事はCakePHP1.2向けです。

CakePHPでテーブルから1行削除するときには、del()を使います。

もしくは、DELETE文を書いて、query()かexecute()を使う。

では、上記の2つの方法の違いはなんだろうか?

それをまとめておく。

1. 戻り値

上の例で、$r1と$r2の関係性を整理しておこう。

関数 delete 成功 失敗
del r1 true false
execute r2 array() array()

executeではDELETEが成功したのか、失敗したのかを判定する方法がない。

これでは、トランザクション処理中に「もしDELETEが失敗したときにロールバックする」みたいな処理ができない。

これを解決する方法は調べたが、よくわからないので、ロールバックしなければいけないようなときは、del()を使いたいです。

問題 => execute()だと、成功と失敗をうけとることができない。

2. SQL

SQLにも違いがある。

execute()はもちろん、書いたSQLが実行される。

del()では、cakePHPがDELETE文を生成してくれるわけだが、

モデル内でbelongsToやhasOneなどでアソシエーションを指定していると、

アソシエーションしているテーブルをJOINしてしまうようです。

こんなJOINは必要がないわけです。

JOINを回避する方法を調べたが、解決方法がよくわからず、unbindModel()や「$this->Model->recursive = -1」も試したが、JOINはされてしまうようです。

パフォーマンスを重視するなら、execute()を使ってもいいかと思います。

問題 => del()だと、必要ないテーブルがJOINされてしまう。

使い分けが上手くできればいいのかもしれないが、やっぱり気持ち悪いです。

1と2の解決策はあるのでしょうか?!

追記

1について。

execute()後に、findById()などで削除したデータがあるかどうかを調べれば、execute()が成功したのか?失敗したのか?わかるのではないかと思い、試してみた。

commit()をしなければデータの削除は行われないので、findByIdしすると普通にデータを取得できた。

DELETEしたのにデータがあるということは、成功したのか?失敗したのか?わからないので、結局execute()ではSQLの成功・失敗を取得することはできなかった。

残念だな。

Pocket

Posted in CakePHP.

CakePHPのBETWEEN

modelファイルのお話。

みたいなSQLをCakePHPのfindメソッドを利用して発行したいときに、

BETWEENの指定で引っかかったのでメモ。

調べたところ、そもそもBETWEEN句が利用できない仕様っぽいので、範囲指定でやろうと思い下記のプログラムを書いた。

これだとうまくいかない。

なぜかわからないが、同一フィールドに対する条件を複数書くと、最後に書いたものだけが生きるみたいです。

これは、フィールド名の後ろに半角スペースを入れるだけで回避できる。

なんか気持ち悪いね。。。

Pocket

Posted in CakePHP.

CakePHPでUPDATE

CakePHPでデータベースのテーブルにデータを保存するには、save()を使います。

この命令により以下のSQLが実行されます。

id name birth b_type
1 hoge 1988-01-01 A

作られたデータをUPDATEしたい場合には、主キーの「id」を指定してsaveすればUPDATEできます。

id name birth b_type
1 foo 1988-01-01 A

しかし、この方法ではUPDATEする必要のないデータまで同じ値でUPDATEしてしまいます。

これを回避するために、save()にはいくつかの引数を与えることができます。

引数を指定してnameだけをUPDATEしてみましょう。

id name birth b_type
1 bar 1988-01-01 A

余計なSQLは避けたほうがいいので、しっかり引数を与えて制御したほうがいいようです。

参考

Pocket

Posted in CakePHP.