プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
CakePHP1.3系、SQLServerの日付型をfind()で取得するときに、無理やりconvertしてみる
KU・SO・GA(-A-)

もともとCakePHP……というかフレームワークは嫌いなのですが、
もっと嫌いになりました。

KU・SO・GA(-A-)

SQLServerとCakePHP1.3の組み合わせなのですが……
とある日付型の項目「column_date1」を持つテーブル「table1」と
やっぱり日付型の項目「column_date2」を持つテーブル「table2」がありましてね。

この2つを結合して「column_date1」と「column_date2」を出力する必要に迫られたのです。

なもんで、table1のmodelを作って、それにtable2をJOINしてみました。
実際のコードはこんな感じですφ(--)

//テーブル結合
$joins = array(
    array(
        'type'     => 'inner',
        'table'     => 'table2',
        'alias'     => 'tbl2',
        'conditions' => array(
            'tbl2.joinID = Table1Model.joinID',
        ),
    ),
);

//検索条件
$conditions = array(
    'AND' => array(
        'Table1Model.whereID' => "aaa",
    ),
);

//取得項目
$fields = array(
    'Table1Model.column_date1',
    'tbl2.column_date2',
);

// データ取得
$this->Table1Model->recursive = 0;
$consul_infos2 = $this->Table1Model->find('all', array(
                'fields' => $fields,
                'joins' => $joins,
                'conditions' => $conditions,
            )
);

ちなみに「column_date1」「column_date2」共にdatetime型です。
そしたらですね。
取得結果がこんな風になってしまったのですφ(--)

column_date1 → 2015-03-03 00:00:00
column_date2 → 2015 3 3 0:00

書式が違うじゃねーか!ボケ!(#゚д゚)

なんでだよー?と思って、発行されてるSQL文を確認したら、
こんなんなってましたφ(--;

SELECT
    CONVERT(VARCHAR(20), [Table1Model].[column_date1], 20) AS [Table1Model__0],
    [tbl2].[column_date2] AS [tbl2__1]
FROM
    [table1] AS [Table1Model]
inner JOIN
    [table2] AS [tbl2]
ON
    (tbl2.joinID = Table1Model.joinID)
WHERE
    ([Table1Model].[whereID] = "aaa"))

CONVERTするのかしないのかはっきりしろや!ボケ!(#゚д゚)

結局、細かいことはよく分からなかったのですが、
大元のテーブルとJOINされたテーブルで日付型の整形が違いました。

JOINした方のテーブル(table2)の項目が日付型って認識されてない感じですかね(--?

KU・SO・GA(-A-)

仕方ないので、fieldsの指定で無理やりCONVERTしてみました。
実際のコードはこんな感じですφ(--)

//テーブル結合
$joins = array(
    array(
        'type'     => 'inner',
        'table'     => 'table2',
        'alias'     => 'tbl2',
        'conditions' => array(
            'tbl2.joinID = Table1Model.joinID',
        ),
    ),
);

//検索条件
$conditions = array(
    'AND' => array(
        'Table1Model.whereID' => "aaa",
    ),
);

//取得項目
$fields = array(
    'convert(VARCHAR,Table1Model.column_date1,111) as column_date1',
    'convert(VARCHAR,tbl2.column_date2,111) as column_date2',
);

// データ取得
$this->Table1Model->recursive = 0;
$consul_infos2 = $this->Table1Model->find('all', array(
                'fields' => $fields,
                'joins' => $joins,
                'conditions' => $conditions,
            )
);

かなり、無理やりですな(--;
これで、まぁ、多少の問題はありつつ期待した値は取れるようになったので良しとしていますが、
どのように対処するのが正解なのですかね(--?

知りたいことは、SQLServer+CakePHP1.3で、JOINした方のテーブルの日付型項目を
CONVERTした状態で(JOINする元のテーブルの日付型項目と同じ書式で)取得する方法です。

やっぱりモデルを2つ作って、モデルの結合で対処しろですか?
結合したいテーブルが2つや3つじゃないので、できれば避けたいっす(-A-;)

やっぱりフレームワークは嫌いです。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:CakePHP1.3系  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事