COUNT

Posted by muchag | CakePHP | 2011-06-30 (木) 20:22:54

COUNT は ‘fields’ なんだそうな。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

取得レコード数を返してくれる。
GROUP BY 句と絡めることで、条件毎のレコード数を返してくれる。

詳細は解説サイト参照。
 

基本

CakePHP で COUNT を利用するには
find メソッドで第2引数に設定する $options の ‘fields’ に設定する。

  1. $options = array(
  2.     'fields' => array(
  3.         'COUNT(*) AS "num"',
  4.     ),
  5. );

このように設定することで、取得レコード数を返す。

num の部分は任意。
但し、 (ダブルクォーテーション)等で括ることを忘れないこと。
(ダブルクォーテーションかどうかは、前後の引用符の用い方による)

DISTINCT とは異なり
Count のように小文字で記述しても動作した。

CakePHP | 2011-06-30 (木) 20:22:54 |

GROUP BY

Posted by muchag | CakePHP | 2011-06-30 (木) 20:02:03

GROUP BY は ‘group’ なんだそうな。
1つ1つルールがあるので
覚えていかねば・・・。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

GROUP BY カラム名
としてやることで当該カラムに重複して存在するデータのレコードをまとめてくれる。

DISTINCT 句と似ているが、GROUP BY は集計関数を併用できる。

詳細は解説サイト参照。
 

基本

CakePHP で GROUP BY を利用するには
find メソッドで第2引数に設定する $options の ‘group’ に設定する。

  1. $options = array(
  2.     'group' => array(
  3.         'User.family_name',
  4.     ),
  5. );

 

COUNT

COUNT 句を併用するなら

  1. $options = array(
  2.     'group' => array(
  3.         'User.family_name',
  4.     ),
  5.     'fields' => array(
  6.         'COUNT(*) AS "num"',
  7.     ),
  8. );

 

ORDER BY

更に、この COUNT 結果に ORDER BY 句を適用するなら

  1. $options = array(
  2.     'group' => array(
  3.         'User.family_name',
  4.     ),
  5.     'fields' => array(
  6.         'COUNT(*) AS "num"',
  7.     ),
  8.     'order' => array(
  9.         'num DESC',
  10.     ),
  11. );
CakePHP | 2011-06-30 (木) 20:02:03 |

DISTINCT

Posted by muchag | CakePHP,困ったTT | 2011-06-29 (水) 23:03:22

DISTINCT の使い方が難しい・・・。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

DISTINCT キーワードはカラム内の重複データを1つにまとめてくれるもの。

  1. SELECET DISTINCT family_name FROM users

とすると、同じ苗字のユーザがまとめられる。

その後集計を必要とするなら GROUP BY 句を用いるべき。

詳細は解説サイト参照。
 

基本

CakePHP で DISTINCT を利用するには
find メソッドで第2引数に設定する $options の ‘fields’ に設定する。

  1. $options = array(
  2.     'fields' => array(
  3.         'DISTINCT User.family_name'
  4.     )
  5. );

 

注意点
大文字で記述

DISTINCT キーワード自体は 全て大文字 で記述する。

Distinct と小文字で記述すると

SQL Error: 1054: Unknown column ‘Distinct User.family_name’ in ‘field list’

というエラーメッセージが出た。

参考元サイト:cakephperの日記 cakeのSQLでDISTINCTを扱う
 

先頭に記述

マニュアルを見ると

  1. array(
  2.     /* snip */
  3.     'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
  4.     /* snip */
  5. )

The CakePHP 1.3 Book:3.7.3.1 find
と書いてあるが
ちょびろぐ:findでDISTINCTを使う際に注意すること
に書いてあるように、DISTINCT を 先頭 に設定しないと

SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DISTINCT `User`.`family_name` FROM `users` AS `User`

というエラーメッセージが出る。
 

アソシエーション

DISTINCT を利用したいモデルにアソシエーションを設定しているときは
‘recursive’ = -1 を設定しないと重複をまとめてくれない。

具体的に試した内容は
User モデルに $hasMany プロパティを設定した状態ではNGだった。

‘recursive’ = -1 を設定したら希望通りに重複レコードをまとめてくれた。
 

複数カラムを取得できない

上述注意点を全てクリアしたものの、単一カラムは取得できても
複数カラムを設定するとエラーにはならなくても、まとめてくれない。

未解決。

CakePHP,困ったTT | 2011-06-29 (水) 23:03:22 |

サブモデルの conditions

Posted by muchag | CakePHP | 2011-06-28 (火) 11:07:15

モデルにアソシエーションを設定しても
データ取得の際にサブモデルの検索条件を設定するのに手間取った。

【環境】
[CakePHP] 1.3.10
状況

A, B, C 3つのモデルが存在する。

A hasMany B
B hasMany C
という状況だとする。
 

基本

サブモデルの条件設定はモデルでできる。

  1. class A extends AppModel {
  2.  
  3.     var $name = 'A';
  4.  
  5.     var $hasMany = array(
  6.         'B' => array(
  7.             'className' => 'B',
  8.             'conditions' => array('B.id' => 1), // ここ
  9.         )
  10.     );
  11. }

 
この手法だと 常に 条件が設定されてしまう。
 

動的に設定する手法

コントローラ内で

  1. $this->A->hasMany['B']['conditions'] = array('B.id' => 1);
  2. $this->A>find('all');

としてやればよい。

孫モデルの設定

モデルC に検索条件を設定したければ

  1. $this->B->hasMany['C']['conditions'] = array('C.id' => 1);
  2. $this->A>find('all');

このようにすればよい。
 
参考元サイト:It’s show time! アソシエーションしてるHasManyを条件文に

CakePHP | 2011-06-28 (火) 11:07:15 |

Poedit

Posted by muchag | Tool | 2011-06-23 (木) 15:11:50

アプリケーションの国際化に利用するツール。

  • .po ファイルを編集できる
  • .mo ファイルを生成してくれる
【環境】
[Poedit] 1.4.6
DL & インストール

Poedit から環境に合わせて DL &インストール。
 

日本語化

遅れて記事を書いているので記憶が定かでないけど
インストール時に言語選択ができたような気がする。

インストールしちゃってからは
[File]-[Preference]
[Personalize] タブの「Change UI language」をクリック。

 
出てくるダイアログで「Japanese」を選択。

Poedit を再起動すれば日本語になる。

 

編集

[ファイル]-[開く]
またはツールバーの一番左のアイコンから
.po ファイルを選択。
 
上中下3つのペインに分かれている。
翻訳候補一覧
 太青 未訳文言
 太黄 既訳だけど問題あり?(Poedit の表示では「未確定」となっている)
   行を選択した状態で Alt + U で確定できる
 細字 既約文言
選択された原文
対訳入力欄

 

.mo ファイルの作成

デフォルトでは、Poedit で保存すれば自動で作成される。

もし作成されない場合は
[ファイル]-[設定] で出てくるダイアログの
[編集]-[動作]
「保存時に .mo ファイルを自動生成する」にチェック。

 

CakePHP で翻訳文言を追加
POT ファイルの用意

多言語対応(国際化) を参考に POT ファイルを用意する。
 

追加

[カタログ]-[POT ファイルを元に更新します]
より、件の POT ファイルを選択。

 
するとダイアログが出るので
「新規文字列」と「もう使われていない文字列」を確認して OK 。

Tool | 2011-06-23 (木) 15:11:50 |

テキストボックスが伸びる

Posted by muchag | HTML | 2011-06-20 (月) 21:11:05

今日初めて遭遇して焦った。
 

現象
テキストボックスが伸びる

テキストボックスに
aaaaaaaaaaaaaaaaaaaaaaaa・・・
と試しに入力したら、テキストボックスが勝手に横へ伸びていく・・・。

jgoaijgiaegjaopiejgoaiejgapgijeapijeaijeklajejgoaijgpaioegja・・・
と滅茶苦茶に入力しても同様の結果になる。
 

自動改行されない

そしてその確認画面へ遷移したら
テーブルレイアウトにも関わらずセルの幅に合わせて自動改行されない。
 

対処

うへ! と思いグーグル先生に質問してみたら
@IT:テーブル内のラベルが自動改行されない
こんなページを見つけた。
 

結論

結果から言えば、何ていうことはない。
半角文字を連続させると、全体で1つの単語として捉えられ
テキストボックスが伸びたり自動改行がなされなかったりするようだ。

はービックリした。 :rool:

HTML | 2011-06-20 (月) 21:11:05 |

date

Posted by muchag | PHP | 2011-06-20 (月) 19:45:25

date 関数はよく使う割にすぐ忘れる。
なんでかなぁ。

PHP Manual:date

【環境】
PHP:5.3.1
書式

string date ( string $format [, int $timestamp = time() ] )

指定された引数 timestamp を、与えられた フォーマット文字列によりフォーマットし、日付文字列を返します。 タイムスタンプが与えられない場合は、現在の時刻が使われます。 つまり timestamp はオプションであり そのデフォルト値は time() の値です。

戻り値:日時型文字列
第1引数:戻り値となる日時型文字列のフォーマット文字列
第2引数:タイムスタンプ。int 型
 

第2引数:$timestamp

タイムスタンプとは 1970年1月1日 09:00:00 (1970年1月1日 00:00:00 GMT) からの通算秒数である。
 

time

int time ( void )

現在時刻を Unix エポック (1970 年 1 月 1 日 00:00:00 GMT) からの通算秒として返します。

PHP Manual:time

現在の日時のタイムスタンプを返す関数。

引数はなく、現在日時以外は求められない。

  1. <?php
  2. time();
  3. ?>

date 関数で第2引数をを省略すると自動的にこの time 関数が用いられる。
 

mktime

int mktime ([ int $hour = date(“H”) [, int $minute = date(“i”) [, int $second = date(“s”) [, int $month = date(“n”) [, int $day = date(“j”) [, int $year = date(“Y”) [, int $is_dst = -1 ]]]]]]] )

与えられた引数に従って UNIX のタイムスタンプを返します。
このタイムスタンプは、Unix epoch(1970年1月1日00:00:00 GMT)から 指定された時刻までの通算秒を表す長整数です。

引数は右から順に省略することができます。
省略された引数は、 ローカルの日付と時刻に従って、現在の値にセットされます。

PHP Manual:mktime

指定日時のタイムスタンプを返す関数。

このままだと見難いが、要は

  1. <?php
  2. mktime(,,,,,);
  3. ?>

ポイントとしては、時刻情報はいらなくて日付だけが欲しい場合でも

  1. <?php
  2. mktime(0, 0, 0, 20, 6, 2011);
  3. ?>

このように 時、分、秒 に 0 を設定しなければならない。
 

strtotime

int strtotime ( string $time [, int $now ] )

この関数は英語の書式での日付を含む文字列が指定されることを期待しており、
now で与えられたその形式から Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 UTC からの経過秒数) への変換を試みます。
now が指定されていない場合は現在日時に変換します。

この関数は、タイムスタンプを計算するために (利用可能であれば) 環境変数 TZ を使用します。
PHP 5.1.0 以降では、日付/時刻関数で 使用されるタイムゾーンを設定する簡単な方法があります。
その方法については date_default_timezone_get() 関数のページを参照ください。

PHP Manual:strtotime

文字列からタイムスタンプを返す関数。

有効な文字列書式は PHP Manual:サポートする日付と時刻の書式

難しいことを考えずに

  1. <?php
  2. strtotime('2011-06-20 00:00:00');
  3. ?>

と、MySQL の datetime または timestamp の書式を用いるようにしている。
 

末日を取得
date

「月」用の書式指定文字に t というのがあり、これは当該月の日数を返してくれる。
つまり、戻り値は 28~31 に限られるわけだけど、これを利用して

  1. <?php
  2. $strDate = date('Y-m-t');
  3. ?>

このようにすることで今月の最終日文字列を取得できる。
 

mktime

「日」に 0 を指定してやることで、前の月の最終日を返す。

  1. <?php
  2. $timestamp = mktime(0, 0, 0, date('m') + 1, 0, 2011);
  3. ?>

前の月の最終日なので、今月の最終日を知りたい場合は「月」を 1 増やしておく。

PHP | 2011-06-20 (月) 19:45:25 |

radio

Posted by muchag | CakePHP | 2011-06-20 (月) 16:07:41

ラジオボタン。

The CakePHP 1.3 Book:7.3.5.16 radio

【環境】
[CakePHP] 1.3.10
書式
  1. function radio($fieldName, $options = array(), $attributes = array())

第1引数:フィールド名(モデルと連結させる気がなければ自由)
第2引数:ラジオボタン群の値と表示文字列。array((値) => (表示内容))
第3引数:属性設定
 

第3引数:$attributes
  1. array(
  2.     'value' => デフォルトで選択される値。checked='checked' にあたる
  3.  
  4.     'separator' => ラジオボタン間に表示する区切り文字。
  5. '<br />' を指定してやることで選択肢を縦に並べることができる
  6.  
  7.     'legend' => ラジオボタン群を囲う枠のタイトル。false でタイトルも枠も非表示
  8.  
  9.     残りは不明
  10. )

 

「0」の取り扱い

木を見て森も見ていこう:CakePHPの良くないところ($form->radio())

あ~確かに。
PHP って、false は空白になるよね~。
昔から嫌だった。
 
<参考元サイト>
Sometime PHP:ラジオボタンの使い方

CakePHP | 2011-06-20 (月) 16:07:41 |

datetime

Posted by muchag | CakePHP | 2011-06-20 (月) 14:36:49

日付選択ドロップダウンセット!
これは素敵だね~♪

The CakePHP 1.3 Book:7.3.5.5 dateTime

【環境】
[CakePHP] 1.3.10
書式
cake/libs/view/helpers/form.php
  1. function dateTime($fieldName, $dateFormat = 'DMY', $timeFormat = '12', $selected = null, $attributes = array())

第1引数:フィールド名
第2引数:日付の並び順。‘DMY’, ‘MDY’, ‘YMD’, ‘NONE’ から選択可
第3引数:時刻の表記法。‘12’, ‘24’, ‘NONE’ から選択可
第4引数:初期選択値配列
第5引数:属性値配列
 

第3引数:$timeFormat

null と設定しているサイトがあったので試してみたら
’12’, ’24’ 以外の値は全て ‘NONE’ 扱いになるらしく
‘hoge’ としてもエラーになるわけでもなく、
時刻ドロップダウンが表示されないという結果だった。
 

第4引数:$selected

null を含めて無効な値を設定すると現在年月日時刻を選択するっぽい。
 

日時指定

特別な年月日時刻を指定したい場合は配列にて指定。

  1. array(
  2.     'year' => '2011',
  3.     'month' =>01',
  4.     'day' => '02',
  5.     'hour' => '05',
  6.     'minute' => '15',
  7.     'second' => '24',
  8. )

とするはずなんだけど、全然指定通りにならない・・・。
 

文字列指定

また
date(‘Y-m-d H:i:s’)

‘2011-06-20 05:15:24’
なんていう指定も有効っぽいんだけど
上手くいかない。

ちなみにこういう指定の場合は 秒まで全部指定 してやらないとエラーになる。
 

第5引数:$attributes

各種設定を行う場所。

  1. array(
  2. 'monthNames' => false を設定した場合、2桁の数字が使る。配列の場合、指定された配列が使用される
  3.  
  4. 'separator' => 各ドロップダウン間での区切り文字。デフォルトは <span class="emphasis_r"></span> (ハイフン)
  5.  
  6. 'minYear' => 西暦選択肢の最小値
  7.  
  8. 'maxYear' => 西暦選択肢最大値
  9.  
  10. 'interval' => 分の選択の間隔。デフォルトは 1
  11.  
  12. 'empty' => true なら選択肢最上部に空の選択肢が表示される。
  13. false なら空の選択肢なし。
  14. デフォルトは true
  15.  
  16. default' => よくわからない
  17. )

 
<参考元サイト>
HappyQuality:FormHelper::datetime()まとめ
↑ 1.2.x の記事のようだ

WEBLE:CakePHP 1.3 で日付フォームはヘルパーの datetime メソッドでとても簡単に作れる

CakePHP | 2011-06-20 (月) 14:36:49 |

create

Posted by muchag | CakePHP | 2011-06-20 (月) 1:50:37

フォームの開始用メソッド

【環境】
[CakePHP] 1.3.10
書式
cake/libs/view/helpers/form.php
  1. function create($model = null, $options = array())

第1引数:モデル名
第2引数:設定格納配列
 

第1引数:$model

モデル名 となっているけど、それは CakePHP のルール通りの素直なパターンの場合だと思われる。
モデル直結のタイプでない場合は、モデル名を指定のしようがないし
根本的に適当に付けてOK。

ただ、フォームによって送られてくる値が
$this->data[$model][‘(フォームパーツ名)’] に格納されるので
素直な場合はモデル名にしておくと、そのままセーブできて楽チン♪
 

第2引数:$options
  1. array(
  2.     'type' => 'post', 'get', 'file', 'put', 'delete' のいずれか。
  3. 'file' を指定した場合は、method="post" で enctype="multipart/form-data" のフォーム
  4.  
  5.     'action' => アクションだけ指定したい場合に用いる
  6.  
  7.     'url' => コントローラから指定したい場合、引数を指定したい場合に用いる。
  8. array('controller' => 'users', 'action' => 'profile', 'id' => 1) のような配列
  9. または '/users/profile/id:1' のような文字列
  10.  
  11.     'default' => 'false' に設定すると submit ボタンでフォームを送信しないようにする事が出来る。Ajax を利用するときなどに。
  12.  
  13.     'inputDefaults' => inputメソッドで使用できる'label''div'などのオプションのデフォルト値を設定できる。
  14. array('label' => false, 'div' => false) などのように。
  15. )

 
参考元サイト:Garacter フォームの作成

CakePHP | 2011-06-20 (月) 1:50:37 |
次ページへ »