[CakePHP]主キー以外で保存する場合はupdateAllを使う

[CakePHP 1.2.3]

主キー以外で保存する場合、どのようにやるのがいいのでしょうか。
実は、ものすごく単純なのですが、updateAllを使います。

いや、「主キー以外といってもユニークキーだからupdateAllじゃなくていいよ! 」という方もいるかもしれませんが、基本的にはそれ以外で対応していません笑

例えば、ArticleとUserモデルがあったとして、
Articleモデル内に、user_idがあったとして、user_idを元にArticleモデルを更新する場合は、コントローラー内で、 以下のようにします。

[php]
$this->Article->updateAll(
array(‘変更するフィールド’ => ‘変更内容’),
array(‘Article.user_id’ => $user_id),
);
[/php]

上でそれ以外方法はないと書いたのですが、以下のようにすることは可能です。

[php]
$this->Article->id = $this->Article->field(‘id’, array(‘Article.user_id’ => $user_id));
$this->Article->save($data);
[/php]

当たり前ですが、この場合は複数カラムを変更することは出来ません。ユニークキーで検索する場合は使えます。

[CakePHP]Security:hashをAuth->passwordの様に使う際の注意点

[CakePHP1.2.3]

管理画面などでpasswordを保存する場合、hash化する際には、Security:hashを使います。

Auth->passwordでもいいのですが、Authコンポーネントをロードしていないコントローラで新しく Authコンポーネントを読み込むと色々エラーが起こり易くなるので、 普通はSecurity:hashを使います。

それで、普通は以下のようにやれば良いのかと思うのですが、

[php]$this->data[‘Model’][‘password’] = Security:hash($this->data[‘Model’][‘password’])[/php]

これだとAuth->passwordと違うハッシュで保存されてしまいまい、ログイン時にマッチングしなくなってしまいます。

どうすればいいかというと、Auth::passwordのコードを覗いてみたら答えが書いてありました。

[php]$this->data[‘Model’][‘password’] = Security:hash($this->data[‘Model’][‘password’], null, true)[/php]

いや、null, trueなくても同じようにしてくれよ。。って感じです。 もしかするとこのcakephpのバージョンだけの現象かもしれません。

ちなみに、2.xでは普通にAuthComponent::password()のようにStaticに呼べます。

この記事は以下の環境に基づいて書いております。

cakephp1.2.3

php5.2.17

[CakePHP]複数検索語句に対してLIKE 検索を行う方法

[Cakephp 1.2.3]

時々プログラミングの話も書いていきます。 Cakephpは、キーワード検索などの際に同一のフィールドに対してLIKE検索を行おうとすると、 配列のキーが重なってしまうため、上手く動作しません。以下のような場合です。

[php]
$conditions = array(‘AND’ => array(
‘Model.field_name LIKE’ => "%".$keyword."%",
‘Model.field_name LIKE’ => "%".$keyword."%"
));
[/php]

まあ、これは言語の仕様上しょうがないところです。 こういうときは、以下のようにして解決できます。

[php]
$conditions = array(‘AND’ => array(
array(‘Model.field_name LIKE’ => "%".$keyword."%"),
array(‘Model.field_name LIKE’ => "%".$keyword."%"),
));
[/php]

この記事における開発環境は以下です。 Cakephp 1.2.3 php5.3 Mysql 5.1