質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1669閲覧

Cakephp2の、counterCacheが効かない問題について

kururi10

総合スコア27

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2015/09/12 03:58

Cakephp2の、counterCacheが効かないのでご質問させていただきます。

処理の流れを書きます。

登場するモデルは
質問モデル:Question
回答モデル:Answer
です。

処理は

$this->Question->bindModel(array("hasMany" => array("Answer")));

$this->Question->find("first", array("contain" => array("Answer")));

その後containしたモデルAnswerにsaveする
$this->Answer->save(array(データ));

すると

Questionに設定しておいたcounterCacheの値が「増えない」

という現象です。

ちなみに、bindModelだけだとcounterCacheの値は正常に増えます。
containをつけると増えなくなります。

Containableビヘイビアはきちんと設定しており、counterCacheもきちんと設定しております。

なぜ効かなくなるのか、同じ経験をされた方は原因をお聞かせいただけると嬉しいです。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Model::bindModel()の第二引数にfalseを指定しない場合は、
次に実行するModel::find()でアソシエーションが解除されてしまいます。

とはいえ上記ソースコードの例で言えば、
Answerモデルにアソシエーションを記述していればcounterCacheは更新されるように思えますが・・・
いずれにしてもアソシエーションを持続させたいならModel::bindModel()に第二引数を指定して下さい。

余談ですが、Modelにアソシエーションをしっかり記述していればContinableビヘイビアのみの使用で、
Model::bindModel()やModel::unbindModel()と併用することはないかと思います。
そもそもbind関連が煩わしいのでContinableビヘイビアを使うわけですし・・・

投稿2016/02/12 03:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kururi10

2016/02/12 06:07

ご回答ありがとうございます。 この質問を投稿してからだいぶ時間が経過してしまったので 今はCakePHP3を使っています>< ご回答いただいた内容を拝見させていただいて、 あ、確かにfalseしていしてないから解除されているのかも・・・ と一瞬思ったのですが、 私の質問文に -------------------------------------------------------- bindModelだけだとcounterCacheの値は正常に増えます。 containをつけると増えなくなります。 ------------------------------------------------------- と書いていたのを見つけ 第二引数をfalseしていなくてもcontainをつけない限りは 1、$this->Question->bindModel 2、$this->Question->find 3、$this->Answer->save という流れでもcounterCacheは正常に増えたようです。 うーん・・・>< でもおっしゃるとおり、 確かにContainableビヘイビアで アソシエーションをつけたりはずしたりすればいいので bindModelしなくてもいいですよね・・・。 Cake3で処理してしまって当時の処理内容を思い出せないのですが、 ご丁寧に回答してくださってありがとうございます(^^)
退会済みユーザー

退会済みユーザー

2016/02/12 06:21

containの記述は気付いていたのですが、 find自体していない可能性も・・・と思いそのまんま回答しました、スイマセン。 ContinableBehaviorのソースも追ってみたのですが、 その中でunbindを使用している箇所がありましたので事前のbindが無効化されるのかな?とも思ってみたり。 しかしながらこちらは詳しく追えていません。 Cake3、いいですね。 私は仕事柄3系はなかなか使う機会がなく、他の方の質問も3系が増えてきて危機感を感じていますw 3系を使うときには質問するかもしれませんので、その際にはどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問