SQL
model
Phalcon
indexHint

Phalconのモデルでindex hintを使う

はじめに

Phalconでもどんなframeworkでもですが、ORMを使うとIndex Hintを使う場合など、ちょっとカブいたSQLを書こうとしたらできなかったりしますよね。
だからって生PDOでSELECTしたらModelのfindを使った時とObjectが一致しないので、何かと不便です。
そういう時、Phalconなら、下記の方法で解決できますYO!

before

find使うと、使ってほしいindexが使われないじゃないか!どうしょ・・

$logs = Model\UserLog::find([
    "conditions" => "user_id = ?0 AND created BETWEEN ?1 AND ?2",
    "bind" => [$user_id, $from, $to],
    "order" => "created DESC",
    "limit" => 10
]);

after

そういう時は、(ほぼ)生PDOで抽出して、Modelに結果をあてこんじゃいましょう。

$model = new Model\UserLog();
$logs = new \Phalcon\Mvc\Model\Resultset\Simple(
    null,
    $model,
    $model->getReadConnection()->query(
        "SELECT * FROM user_log USE INDEX (idx_created) " .
        " WHERE user_id = ? AND created BETWEEN ? AND ? " .
        " ORDER BY created DESC LIMIT 10",
        [$user_id, $from, $to]
    )
);

まあ上記のようにサービスに書くくらいなら、Model側に書くべきですよね。。

小言

最近どのFWにも入ってるORMですが、オールドタイプなので何がいいのか未だに理解できないでいます。