技術メモ

FuelPHPのORMキャッシュにハマった件

更新日:

今日はFeulPHPのORMキャッシュ機能にやられました。見ず知らずの人のために記録しておこう。

ちなみにグーグル先生に

FeulPHP キャッシュ ORM で聞けば同じようなブログ記事はわんさか出ますので、あまり細かいコード部分はここでは詳しく書きません。

問題は、そこに気づくまでの過程だと思うので、そこを中心に書きます。

単にいちいちコード書いて説明するのがめんどくさいってのもありますw

きっかけは、DBからデータを拾ってきて、メールにデータ埋め込んで送信するシステムの作成をしていたのですが、なんか一部の情報が入っていない。

ORMからの戻りをダンプして取ってみたところ、データが欠損しているのです。

SELECTで取っていないわけではなくて一部のカラム情報が抜けている。何故だ!?

最初のうちは、自分が作ったコードに不備があるんじゃないかと思い調べるが、別にヘンなわけではない。

DB側に流れてきたSQLを見た感じでも、正しいSQLのようです。

手詰まりになったので、仕方なくFuelのコアのメソッドをたどっていくことにする。源流に近いところのメソッド get   hydrate あたりにログを仕掛ける。

そうすると、DBからかえってきたホヤホヤのデータ配列は完全なデータで欠損が無いのに、hydrate関数を通過すると欠損していること発見。

hydrate関数の中身を読んでみると、キャッシュのif文記述がある。キャッシュがある場合はそっちを優先するってことか。

if文を強引に変えてキャッシュを切ってみたら。。。。なおった!!

なんじゃこれは?よくよく読むとこの記述では、なんも考えずにディフォルトで動かすと先に流れたSQLの結果をキャッシュして、その後はそのキャッシュ結果を返すようです。

で、グーグル先生に質問したら出るわ出るわ。。。。。先人の苦労話

これってバグじゃないか?バグではないとしてもクソ仕様認定だね。

私の場合、

$Model_Hoge::query()
->select(‘id’,’name’)
->where(‘id’, 2)
->get_one();

という感じで特定のidと名前を取得した後の工程で、同じレコードの他のカラムの値も取ろうとして

find_by_id

とだけ書いたのですが、期待したIDの全カラムデータが返ってこなかったのです。

find_by_idって書いたら、普通はそのレコード全部返ってくるだろう!

と思ったのですが先に流れたSQLのキャッシュが効いてしまい、id,name しか返ってこなかったことになります。

私が欲しかったのはあと2つだけの情報なので、最初のクエリーで

select(‘id’,’name’,’mail’,’date’)

という感じで書いてやることで無事解決。

まあ、タダで使わせてもらっているモノなので文句を言うことはできないですが、もうちょっと作り手のこと考えろよ。Fuel作ってる方々。

中の人にとっては使い方が悪いだけ、正しく使えバカって言うのかもしらんが、初心者にとっては無駄な時間を取らせるだけで、利用者にやさしい設計ではないよね。

オープンソースを使うというのは、こうゆうトラブルを自力で解決しないといけないことがあって、結構しんどいです。

でもその作業、嫌いじゃない。

-技術メモ

Copyright© ばしさんの開発ブログ , 2019 All Rights Reserved Powered by STINGER.