ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

初心者考察。仕様通りのプログラムってどうだろう?

photo by racheocity

最近ブログのネタが溜まりつつある。。。。。

インプットはすげーたくさんしていますが、アウトプットがうまくできていないですー^q^

今日はブログ書く日にしようかなと思います。

さて、昨日の仕事っぷりをメモしようと思いますが、いやー。まだまだですね。プログラムを組む速度が全然遅い。

いろいろ集中が切れるのが一番の原因かな。もっとのめり込むようになりたいです。

んで、今仕事で触っているプログラムは以前外注して作られたものです。そのプロジェクトの追加仕様(ほとんどバージョンアップですけど)の対応を俺が任されています。

コードをみて改修していますが、その際に思ったことをメモしようかなと。

続きを読む

【CakePHP】Behaviorの使い方をおさらい

いい加減にしてもらおうか!!!

当時、私は就業中に頭のなかでそう叫んだ。

なんか小説みたいな出だしですが、メモしていないことってだいたい記憶の中から消えてしまいます。

私はこのブログをよくメモ代わりに使っていますが、ここに載っていないことって優先事項順で技術系なことは消えていってしまいます。

で、CakePHPのBehaviorですよ。使い方ですよ。

もうググッて5〜6回目だと思います(こういうことは覚えているんだよね。。。)。いい加減覚えようと思いますのでメモ

続きを読む

【CakePHP】$this->find('all', array('fields' => 'count()'))で取得した値がキモいので直す

たとえばこんな$this->find()を記述したとする。

<?php

$this->find('all', array(
  'fields' => array(
    'name',
    'count(name) as idCount'
  ),
  'group' => array(
    'name'
  )
));

とあるModelでnameをグルーピングしてそれぞれ合計を数えるSQLを発行してくれる。

んで、結果はこれだ。

Array
(
    [0] => Array
        (
            [Model] => Array
                (
                    [name] => 名前
                )

            [0] => Array
                (
                    [idCount] => 8
                )

        )
)

キモい。。。。。なんだこれ?

これはさすがにつかえないので、組み換えが必要である。外人さんのサイトが参考になった。

zenofcoding.com

どうやらAppModel.phpで、afterFind()をOverrideすればいいっぽい

  • ~/app/Model/AppModel.php
<?php

class AppModel extends Model {
  function afterFind($results, $primary = false) {
    if ($primary == true) {
      if (Set::check($results, '0.0')) {
        $fieldName = key($results[0][0]);
        foreach ($results as $key => $value) {
          $results[$key][$this->alias][$fieldName] = $value[0][$fieldName];
          unset($results[$key][0]);
        }
      }
    }
    return $results;
  }
}

ごちゃごちゃしていて見づらいですが、afterFind()は、findから返された結果を変更するため用意されているコールバックメソッドです。

んで、Set::check()で配列$resultsに特定の配列パス'0.0'がセットされているか調べるCakePHPのClassです。

ここまで条件が通れば、あとはキモいところの配列を修正してArray([0][Model])の箇所に入れる処理ですね。

すると。

Array(
  [0] => Array
    (
      [Model] => Array
        (
            [name] => 名前
            [idCount] => 8
        )
    )
)

すごくきれいになりました。ヾ(´∀`)ノキャッキャ