トップページ⇒php
1001コメント324KB

【PHP】フレームワーク CakePHP 3ホール目【本命】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/03/14(金) 15:16:00ID:HF9x5ODX
http://www.cakephp.org/

10分で作るCakePHPアプリ for Windows
http://p4life.jp/cake/

マニュアル日本語化
http://www.cakephp.jp/doc/

日本語フォーラム
http://cakephp.jp/modules/newbb/

あとこのへんとか(初心者向けTIPS)
http://www.avatarfinancial.com/pages/cake/

CakePHP入門リンク集
ttp://pub.studio15.jp/2007/11/13/cakephp-links/

【PHP】フレームワーク CakePHP 2ホール目
http://pc11.2ch.net/test/read.cgi/php/1194976228/
【PHP】フレームワーク CakePHP
http://pc11.2ch.net/test/read.cgi/php/1163850802/
07847732008/05/09(金) 01:55:42ID:???
サンプルコードまでご提示下さり、ありがとうございます。おかげでフル装備
じゃないや、スマートな実装ができました。

どうもありがとうございました。
0785nobodyさん2008/05/09(金) 09:23:43ID:???
>>783
質問だけど。
3でbase64_encodeする意味合いって何があるの?
0786nobodyさん2008/05/09(金) 18:49:37ID:???
>>783

自分は 1。

セキュリティがどうこうっていうプログラマーさんがいるでしょうけど・・・。
07877832008/05/09(金) 18:55:31ID:???
>>785
すみません。よくわからないで書いてしまいました;;
シリアライズだけで十分ですか?

>>786
最終的にsaveするまえにしっかりバリデートすれば、それでも問題ないのかもしれませんね・・・
でもやっぱりソース見たときに、パスワードとかメールアドレスがもろに書いてあると、
このサイト大丈夫か??って気になりますが・・・

ちょっと気になったのですが、PEARのHTML_QuickForm_Controllerなんかは
どの方法なんでしょうか??
0788nobodyさん2008/05/09(金) 20:19:38ID:???
貧乏人は贅沢だ
不満を言う余裕はあるくせに
戦争する暇もある
0789nobodyさん2008/05/10(土) 00:11:55ID:???
>>787
ソース見られたらっていうのは確かにある。
しかもそれを無理矢理改ざんして入力不可の文字を入力される可能性もある。

しかし、よほどのサイトじゃないとそこまでハッカーも暇じゃないから攻撃しないのでは?
と思います。

現に、ここ 5年ほど、何も問題ありませんでした。
0790nobodyさん2008/05/10(土) 16:35:26ID:???
>>789
問題があってからじゃ遅いんだぞ!
と思いつつも、もりもりhiddenに入れ込んでしまう。。
0791nobodyさん2008/05/10(土) 17:55:53ID:???
>>787
セキュリティ目的ならbase64_encodeは用をなさないという認識。

>>789
データはhiddenで埋め込んでおいて、$this->dataをserialize後saltつけてハッシュ化したやつを別でhiddenに埋め込む
↑のふたつを比較して整合性チェックとか?
0792nobodyさん2008/05/10(土) 18:59:59ID:???
今、ここを覗いている筑波大学へ

ばれてるぞ!
0793nobodyさん2008/05/10(土) 19:29:59ID:???
別に半角文字列板とかじゃないんだからバレたっていいだろうに。
0794nobodyさん2008/05/11(日) 11:28:50ID:qWqUPYxD
日本語フォーラムと2ちゃん、どっちの方がコメントもらえるのかな?

と言いつつ、いつもこっちに書くのだけど・・・。


下の記事を参考に、携帯用ページを作っています。
ttp://www.1x1.jp/blog/2008/04/cakephp_12_routing_prefix.html

で、paginateでページングされているのですが、ひとつ問題が。

pagineateの結果、下のようにURLが生成されるのですが、
携帯エミュレータ(P1エミュレータを使用)で確認したところ、
どうやら「page:2」のセミコロンが、有効な値ではないとエラーになるっぽいです。

<a href="/~recipe/m/responses/view/page:2">2</a>


これって、どう対応すればいいのでしょう?
0795nobodyさん2008/05/11(日) 12:01:33ID:???
app/config/routes.phpにRoute::connectNamed(array(),array('argSeparator'=>'=')); を追加
07967942008/05/11(日) 13:42:34ID:???
>>795
Router::connectですね。

ふぉぉ、すぐに答えていただきありがとうございます!
PC側の方もちょっと調整が入りますが、おかげで解決しました!
0797nobodyさん2008/05/12(月) 02:29:40ID:8yg2YXGe
CakePHP1.2のバリデーションについてよく整理されたマニュアルとかってないかな

バリデーションルールが多様になったほかに、create時update時それぞれに有効無効に
できるなんてこと知ったのだけど、その他含めてちゃんとまとまった情報ってないかな
0798nobodyさん2008/05/12(月) 18:22:39ID:???
AuthComponentsで、ユーザー情報を取得し直したいとき、どのようにすればよいでしょうか?

たとえば、
ログイン後にユーザーメニューからユーザ名の変更などを行った場合、
セッションには変更前のユーザ名が格納されているため、
ヘッダーなどに表示されている
「ようこそxxさん」のような表示が変わらない、ということになってしまいます。

いちおうの解決策としては、
セッションにはIDのみを格納しておいて、
app_controllerで
毎回、$this->User->findByIdしてセッションに記憶させるという方法をとっていますが、
あまりスマートではありません;

ユーザ名の変更処理の直後のみユーザ情報を取得しなおしたいのですが、
なにかよいアイデアはないでしょうか?
0799nobodyさん2008/05/12(月) 20:51:58ID:???
>>798
なんとなくでレスしてるが変更と同時にセッション内容も書き換えればいいんじゃないの?
0800nobodyさん2008/05/12(月) 22:27:51ID:???
公開用Webサイトに1.2系使ってる人っている?
DBからデータをviewで表示するだけなら1.2でも大丈夫かな?

現在は1.1で運用中。
多言語対応が1.2でやりやすいのなら、1.2で作りかえるんだけど。
0801nobodyさん2008/05/12(月) 22:35:05ID:???
>>800
俺はやっちゃったw

半年ぐらいCakePHP使っていて、コアの中まで見てると
大丈夫なんじゃないかなぁと思う。

バグではないが、ベータ版だから仕様が変わるのが
ちょっとネック。
08027942008/05/13(火) 00:21:01ID:???
>>800
いま、2ちゃんねるのレシピ集のサイトをCakePHP1.2で作ってます。
paginatorなどが使いたかったのと、バグっても差し支えないので。


で、ひとつバグらしきのに当たりました。

先に書いた通りのページを参考に、URLルーティングのprefixを使って
携帯用とPC用のページを作り分けしたのですが、この状態でpaginatorを使うと、
PC側のページで、$paginator->prev、nextで何故か携帯用のURL
(/m/:controller・・・)へ飛ばされる事象が。

prefixを設定する前は発生していませんでした。


原因は不明ですが、これまた何故か$paginator->optionsの設定次第で
事象が発生したりしなかったりするので、発生したPC用ぺージでは、

$paginator->options(array('url'=>array("test" => 'test')))

と、ダミーのURLオプションを追加してごまかしています。
0803nobodyさん2008/05/13(火) 02:42:36ID:???
1.2の正式バージョンていつごろ出るのかな?
乗り換えるべきかどうか迷う・・・
0804nobodyさん2008/05/13(火) 13:48:12ID:???
>>800

cakephp 1.1 も 1.2 も両方開発してアップしてますけど両方問題ないですよ。

ただ、モバイルサイトも作ろうと思えば 1.1 の wevservices が便利です。
0805nobodyさん2008/05/13(火) 18:13:48ID:???
1.2じゃなきゃ使いたくないズラ
0806nobodyさん2008/05/13(火) 19:48:08ID:???
画像表示系のコンポーネントを作って使うとき、
最後にheaderでContent-typeなどを指定するわけですが、
controller.phpのheader(”location...とかぶってしまって、エラーが出てしまいます。

みなさんはどのように処理しているのでしょうか?

わかりずらくてすみません・・・;
0807nobodyさん2008/05/13(火) 19:56:04ID:???
>>806
わかるわかる。
<img src="hoge.php?=">

みたいなので読み出すやつでしょ?
僕はギブアップしましたね。

ttp://www.hideblog.net/thumbnails/

を使ってます。
08088062008/05/13(火) 20:02:52ID:???
>>807
それです!
わかってもらえて安心しました。

リンク先のものは、キャッシュに保存してそれを表示する、というものでしょうか?
これはこれで便利ですが、やはりできればストレートに表示したいですね・・・
0809nobodyさん2008/05/13(火) 22:25:09ID:Akbr9Dkj
>>806
ob_clean()はどうでしょう。
0810nobodyさん2008/05/13(火) 22:27:45ID:???
>>807
まったくもって意味がわかりませんが
たぶんこれで解決でしょう。

http://www.ideaxidea.com/archives/2008/01/cakephpcsv.html
0811nobodyさん2008/05/14(水) 09:31:44ID:???
CakePHPの話題ではないかもしれませんが・・・

たとえばタスクをステータス別に表示する場合


コントローラ側で、
$this->set('yet_tasks', $this->Task->findAllByStatus('yet'));
$this->set('done_tasks', $this->Task->findAllByStatus('done'));
のように二度取得するのと、

$this->set('tasks', $this->Task->findAll());
として、

ビューで

foreach ($tasks as $task) {
if ($task['Task']['status'] == 'yet') {
echo ....

とするのでは、
どちらのほうがパフォーマンスが優れているのでしょうか?

ご教授お願いします。
0812nobodyさん2008/05/14(水) 09:48:17ID:???
どっちもだめ
0813nobodyさん2008/05/14(水) 09:49:25ID:XltYBCAy
前者のほうが毎回DBアクセスが発生するため速度という点でのパフォーマンスは悪いでしょうね。

後者のほうは、、ビューにあまりそこまで複雑なロジックを記述することによるコードの効率の悪さ
という点でパフォーマンス難ありかも。

対象となるデータ量次第だけど、そこまでデータが多くなくてサーバのスペックが十分であれば前者の方が
コーディングは早いんじゃね?個人的な意見だけど。
0814nobodyさん2008/05/14(水) 13:49:50ID:???
806です。
>>809>>810

その方法は試してませんでした。
次回やってみようと思います。
ありがとうございます。
0815nobodyさん2008/05/14(水) 14:46:18ID:???
デザイナーの要望に応えてちょちょっと変更するときなんて、
viewいじった方が早かったりするんで、
ついついやっちゃうんだよなぁ。
んで、気づいたらviewがえらいことにw
0816nobodyさん2008/05/15(木) 00:40:28ID:???
CakePHPかRuby on Railsかで迷ってます。

サーバー関連の知識が全くないのですが、
アプリ完成後の公開寸前で困らないためには、
CakePHPを選んでおいたほうが、すんなり公開できるでしょうか?
0817nobodyさん2008/05/15(木) 00:57:18ID:???
>>816
どっちも自分で試したほうがいいと思う。
俺は慣れてるからCake好きだけど。

最低限のアプリ作って鯖置くまで試してみる事をオススメする。
08188162008/05/15(木) 01:04:37ID:???
>>817
レスありがとうございます。

Cakeならば格安のレンタルサーバで試してみることもできるのですが、
Rubyとなるとそこそこ値の張るところでないとダメみたいで、
それだけのお金を出して、設置できなかったとなると・・・

1.2の安定版ももうすぐみたいですし、
やっぱり初心者にはCakeなんですかねぇ・・・
0819nobodyさん2008/05/15(木) 01:14:45ID:???
>>818
つ仮想サーバ または 適当な空きマシンでlinux
0820nobodyさん2008/05/15(木) 17:54:14ID:???
レンタルサーバーで問題なのはお金よりも
むしろサーバーを管理できるかどうか。

http://www.fs-virtual.jp/spec/hikaku.html 945円/月〜
http://www.tsukaeru.net/plans/vps/ 2480円/月〜
http://www.ymc.ne.jp/service/managed/plan/index.html 4950円/月
0821nobodyさん2008/05/15(木) 21:43:23ID:???
  ☆ チン

        ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・)<  1.2まだー?
             \_/⊂ ⊂_)_ \_______
           / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
        |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
        |           .|/
0822nobodyさん2008/05/19(月) 16:23:52ID:???
MediaView(/cake/lib/view/media.php)ってどう使うんだろう?
http://dsi.vozibrale.com/articles/view/mediaview-is-a-bleeding-bastard
http://bin.cakephp.org/view/1026359650
を読む限り、特殊なファイルをダウンロードさせたいときとかに使うみたいだけど、
適当に読む限りファイルを出力するヘッダー情報の段階のことしか書かれていない。(あ、Viewの部分だから当然か)

おそらく、データーベースからグラフをGDとかでスクリプト側で作ったものを表示する場合なんかで
使うんだろうけど、このスクリプトで合成した画像のバイナリデーターはどのタイミングで、どこの関数に格納すればいいのやら?
08238772008/05/20(火) 09:40:48ID:xs/omlLe
http://IP/controller/
にアクセスするとhttp://IP/controller/indexが
デフォルトで実行されますけど、このアクションを変えるには
どうしたらいいですか?
0824nobodyさん2008/05/20(火) 11:01:51ID:???
>>823
http://cakephp.jp/doc/ch04s03.html
かな
0825nobodyさん2008/05/20(火) 11:16:01ID:???
CakePHP 1.2 stable coming soon と言ってるから、そろそろ 1.1 -> 1.2 移行手順をまとめたいな

絶対に手を入れるところ
推奨されているところ
とか
はまりポイント
とか
0826nobodyさん2008/05/20(火) 11:38:08ID:???
ttp://puyo2.upper.jp/cake/ のPDFを中心に

■絶対に手を入れるところ
・設定ファイルの変更(Warning出しながら動くけど)
# /app/config/core.php
define('DEBUG', 1);
→ Configure::Write('debug', 2);

→ Configure::write('Security.salt', 'your original string'); # add

・ヘルパー変更に伴い、view全般
非推奨または廃止されたもの
$html->input
$html->submit
$html->tagErrorMsg etc...
新たに強化・追加されたもの
FormHelper
PaginatorHelper
XMLHelper

■推奨されている
・validatesに引数を渡さない
$this->ModelName->validates($this->data);
→ $this->ModelName->data = $this->data['ModelName'];
→ $this->ModelName->validates();
・viewの拡張子
action_name.thtml
→ action_name.ctp

間違いあったら訂正よろしく
0827nobodyさん2008/05/20(火) 13:22:09ID:???
find系もなんか修正あったんじゃなったけ?
0828nobodyさん2008/05/20(火) 19:13:39ID:???
検索してもうまく見つけられなかったので、教えてください。
SELECT * from `Model` WHERE ( `Model`.`field_1` like '%xxx%' OR `Model`.`field_2` like '%xxx%' ) AND `field_3` = 'yyy';
みたいなSQLを発行したい場合の$conditionsの指定はどうしたら良いのでしょう?

また、
SELECT * from `Model` WHERE concat( `Model`.`field_1` , `Model`.`field_2` ) like '%xxx%';
というのも知りたいです。
0829nobodyさん2008/05/20(火) 19:19:52ID:wZOYKZBI
バージョン1.2のAuthComponentでの認証で二重ログインを防ぎたいんだけど、
良い方法か参考ページがあったら教えて下さい。
0830nobodyさん2008/05/21(水) 01:03:54ID:+T6Kz2/1
CakePHPってDBのカラム名まで縛るのね。
その時点で候補から外れたね。
0831nobodyさん2008/05/21(水) 01:16:01ID:???
>>830
さようなら。
その縛りなしで行こうと思えば行けるんだけどな。
じゃぁの。
0832nobodyさん2008/05/21(水) 01:57:45ID:???
>>830
そんなに大変?
たしか、RoRでもあったと思うけど。

idとcreatedとmodifiedくらいしか意識した事ないけど、
他にもあるのかな?
0833nobodyさん2008/05/21(水) 02:29:51ID:???
というかしばるから便利なわけですが
0834nobodyさん2008/05/21(水) 10:27:32ID:???
>>832
name or title フィールドでgenarateListが自動的にidと配列を返す
あとは、xxx_id とか xxx_yyy とかのアソシエーション系かな?

いずれにせよCoCの理念に同調できない人はRoRをはじめとしたフレームワークは無理だわな。
RoRではなく、Cakeスレに書き込む>>830に乾杯
0835nobodyさん2008/05/21(水) 12:50:06ID:???
> name or title フィールドでgenarateListが自動的にidと配列を返す
そういえばそんなものもあったね。1.2では
find('list')にかわるわけだけど。

ソース見たけど、1.2betaの段階では、フィールド名指定する方法
無かった気がする。なんでだろうね。

結局は、genarateListを1.2で動かしたときの警告の通り
find('all')の検索結果をSet::combine($results, $keyPath, $valuePath);
しているだけなんで、自分でやればいいんだけどね

> あとは、xxx_id とか xxx_yyy とかのアソシエーション系かな?
これはなぁ・・・みんな同じような名前のつけ方しない?
○○テーブルのIDなんだから○○_idって。
0836nobodyさん2008/05/21(水) 18:07:50ID:???
カラム名とか考えるの苦手なんで縛られてた方が楽だな俺は。
コントローラ名とかメソッドの名前とか考えるのホント嫌。かっこいい名前考えるセンス無くて。
0837nobodyさん2008/05/21(水) 18:10:51ID:???
スペル調べたりするのも面倒だから、ローマ字とかw
0838nobodyさん2008/05/21(水) 18:29:28ID:???
たしかに項目全部のスペル調べるのって時間かかるよなw
非英語圏の俺涙目
0839nobodyさん2008/05/21(水) 22:53:45ID:???
>>838
あれ、こんなところに俺がいるぞ?w


最近、アルクで調べるようになって、ちょっと楽になった。
ttp://www.alc.co.jp/


カラム名は適当な英語でいいが、テーブル名はきちんとした英単語になってないと、
単複の変化がねぇ。。。
0840nobodyさん2008/05/21(水) 22:58:34ID:???
ローカルに辞書ソフト入れておいたほうがいいぞ。
どうもウェブだと時間がかかる。

おれはMS Officeについていたbookshelfを使っている。
08418392008/05/21(水) 23:38:50ID:???
>>840
Bookshelfか。懐かしいなぁ。

Bookshelfもいいんだけど、アルクは例文がいろいろ出てくるので、
そこがおすすめ。
たしかにローカルの方が速いけどね。
0842nobodyさん2008/05/22(木) 00:42:45ID:???
>>839

俺発見!
0843nobodyさん2008/05/22(木) 09:57:07ID:???
□cake.phpがapp/webroot以下のsqliteファイルを見てない?

sqliteファイル(app/webroot/cake.sqlite)を用意してから
cake.phpを実行しているけどエラーメッセージが出て怒られる。

sqliteファイル(app/webroot/cake.sqlite)を
./cake.sqliteに移動してやると「Bake All complete」。

□エラーメッセージ
$ php cake/console/cake.php bake all Post
...
Error: Missing database table 'posts' for model 'Post'

□app/config/database.php
<?php
class DATABASE_CONFIG {

var $default = array(
'driver' => 'sqlite',
'persistent' => false,
'host' => 'localhost',
'port' => '',
'login' => '',
'password' => '',
'database' => 'cake.sqlite',
'schema' => '',
'prefix' => '',
'encoding' => ''
);
}
?>
0844nobodyさん2008/05/22(木) 13:44:12ID:???
英語の豆知識
Data : 複数形
Datum : Dataの単数形

CakePHPやるまで知らんかった。。。
0845始めるっす さん2008/05/23(金) 16:47:14ID:b0nY9q6k
教えてください。
CAKEを使う際、一番いい、IDEは?

http://www.asial.co.jp/vsphp/

↑は、どうですか? よろしくお願いしまっす(@^^)/~~~
0846nobodyさん2008/05/23(金) 16:57:32ID:???
これは分かりやすい駄目な宣伝の例ね
0847nobodyさん2008/05/23(金) 17:01:19ID:???
>>844
なにそれマジで?
0848nobodyさん2008/05/23(金) 17:10:31ID:???
受験英語でも覚えたことだろ。
ここは中2以下ばかりだったのか。

まあ、あおりはともかくとして、
この業界、Allow をアロー、Denyをデニーと発音する低脳が異常に多いよな。
ここまで自然言語の才能が乏しいと、プログラム言語をいくらがんばっても限界が低いだろうね。
0849nobodyさん2008/05/23(金) 17:21:39ID:???
>>848
じゃあなんて読むの?
まぁ seo をセオって読むやつは問題外。
0850始めるっす さん2008/05/23(金) 17:35:52ID:b0nY9q6k
>>846

いえ、業者の者ではありません(~_~;)
エクリプスのジャバーでしたが、CAKEを使うことになりました…

PDTとかも良いかなーと思いましたが、
ちと、芸が浅い(@_@。

何か良い、ツールを教えてくださいっす(^^)/~~~
0851nobodyさん2008/05/23(金) 19:09:24ID:???
>>849
セオはリスク管理できないから、
ダメーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー!!!!!!!!!
0852nobodyさん2008/05/23(金) 22:56:00ID:???
http://image.itmedia.co.jp/l/im/pcuser/articles/0805/21/l_ht_0805hph05.jpg
ハァハァ〜
0853nobodyさん2008/05/24(土) 01:49:40ID:UmgGcxR0
CakePHPに限らない話だけど、PHP系のフレームワークで
DBのトランザクション管理とかってどうやってる?
SpringとかのDI/AOPに代わる画期的な方法とかあるの?
0854nobodyさん2008/05/24(土) 09:43:12ID:???
DBのトランザクション管理 と DI/AOP が どう関係があるのか?
0855nobodyさん2008/05/24(土) 11:08:39ID:???
>>854
※ちょっとスレ違いでゴメン。

DI/AOPを使えば、ロジック層の前後で自動的にトランザクションの
開始とコミットを行うように設定できる。
だからロジック層では特にトランザクションを意識しないで
純粋にロジックだけを記述できる。
もし、ロジック層で例外が発生した場合は自動でロールバックもしてくれる。

他にもログの記述とかオブジェクト指向では対応できない
横断的な処理はAOPの機能を使ってメソッドの呼び出しの前後で
自動的に挟み込んでくれたりできる。

ってな感じでやってるとDI/AOP無しのアプリはきついなーと
思うんだけど、そこら辺はうまいやり方があるのかね?
0856nobodyさん2008/05/24(土) 21:23:01ID:???
社会科学:Data->Datas
自然科学:Datum->Data
0857nobodyさん2008/05/25(日) 00:56:50ID:???
>>855
できるかどうかという話と、
実際にやるのかという話は別問題。

たしかにAOPを使えば、そういうことが言語レベルで出来るだろう。

だが、オブジェクト指向で作られていても
実際には、トランザクションやログなど、よく使われる場所で
処理を割り込ませることができるような設計になっているから問題ない。
0858nobodyさん2008/05/25(日) 22:20:48ID:???
cakephp でサイトを一つつくります。
そのcakephpってどうする?

1.プラグインとかコンポーネントとか残したまま再利用。
2.もっかい新しくcakephpをダウンロードして、プラグインとか入れ直す。

1だと、コードがどんどんぐちゃぐちゃになりそうだし、使わないコンポーネントとかも残る可能性がある。

2だとプラグインとか入れ直すのが面倒下さい。

僕的には1ですが、みなさんいかがでしょうか。
0859nobodyさん2008/05/25(日) 22:21:40ID:???
>>858
追記

一個サイトをつくったあと、さらにもう一つの新しいサイトを作る場合。です。
0860nobodyさん2008/05/25(日) 23:45:46ID:???
好きにすりゃいいよ。
0861nobodyさん2008/05/26(月) 09:21:10ID:???
掲示板のシステムを CakePHP で作ろうと思っています。
モデルは Post(記事) と Comment(コメント) です。
そして Post 一覧表示で Post 毎の Comment の数も同時に表示したいと思います。

この時、Comment の数はどのように算出するものなのでしょうか?
自分で思いつく範囲は次の通りでした。

1. Post 1つ毎に select count() from Comment where 〜 を発行する。
2. select * from Comment で全ての Comment を取得し、アプリ側で Post 毎に数をカウントする。
3. Post テーブルに count 列を用意し Comment 登録時にインクリメントする(非正規化)。
4. 3.の動作をトリガーで実現する。

このようなケースはよくあると思うのですが、一般的にはどのような方法が使われている
ものなのでしょうか?
0862nobodyさん2008/05/26(月) 15:22:28ID:???
>>861
それってアソシエーションを知った上での質問?
0863nobodyさん2008/05/26(月) 16:03:07ID:7/wrhW70
>>862
ああ…突っ込んじゃったよ。ほっときゃいいのに。
0864nobodyさん2008/05/26(月) 16:09:39ID:???
アソシエーションは Post hasMany Comment の関係で Post を1つ取得すると
自動的に任意の Comment が取得できるという、CakePHP 独自の仕様程度
にしか理解していませんでした。

もっと理解すれば上記の話はうまく解決できるという指摘でしょうか?できるだけ
データベースの負荷はかからないように設計したいと思っています。
もう少し調べてみます。ご指摘ありがとうございます。
0865nobodyさん2008/05/26(月) 16:29:06ID:7/wrhW70
>>864
>Post を1つ取得すると 自動的に任意の Comment が取得できるという、

ヒント:
$ret = $MyPost->find($id);
echo count($ret['Comment']);
0866nobodyさん2008/05/26(月) 16:44:00ID:???
>>865
ヒント、ありがとうございます!

>>862 で「ほっときゃいい」と言われるので、何か失礼なことを書いてしまったのか
と心配になっていました。

> $ret = $MyPost->find($id);
> echo count($ret['Comment']);

はい、上記で Comment の数が取得できるのは理解できます。ただ、この方法だと
総数だけを取得するのにその他のデータまで同時に取得してしまうため、データベース
への負荷が余計にかかるのではないかと心配だったのです。

また、1つの Post だけを取得するのなら上記の方法を採用するのですが、今回は
Post の一覧なのでその数が数百以上になることも考えられ、できるだけデータベースに
負荷のかからない方法を採用したいと思っています。

非正規系になってしまいますが、posts テーブルに count 列を持てば、たった一つの
SQL で実現できるなとは思ったのですが、これが一般的な方法なのかどうか判断が
つきませんでした。

これは CakePHP のお話ではなく SQL のスレの方が適切だったのでしょうか…。
0867nobodyさん2008/05/26(月) 17:15:08ID:7/wrhW70
>>866
つ echo $Count->findCount($hogehoge)

ただし、コードが多くて読みにくくなってもよいならば。
サーバのリソース次第だろうけど、>>865にしたところで速度的に雲泥の差があるとは思えないけどね。>>865の方が投げるSQLは一つで済んでるはずだし。
実際にコード書いてテストデータ突っ込んでみて、検証してみれば?
0868nobodyさん2008/05/26(月) 17:45:04ID:???
>>867
ありがとうございます。

そして了解しました。不慣れな初心者なもので時間はかかるかもしれませんが、
考えられうる全ての方法を実際に検証してみようと思います。

確かに Comment のような小さなデータの場合、find($id) で総数をアプリ側でカウント
するのと、findCount() でデータベースにカウントさせるのではそんなに変わらないかも
しれませんね。ただ、Comment がカラム数 100 もあるようなデータの場合で、常に Post
に対して数百も付属しているような場合だと結果は変わるような気がします。そのあたり
も含めて検証してみようと思います。
0869nobodyさん2008/05/26(月) 18:37:58ID:???
要するにcakephpのmodelにカウンタキャッシュはあるのかって質問か。

あるの?
0870nobodyさん2008/05/26(月) 18:49:48ID:???
あるんじゃね?こんな書き込みあるぐらいなんだから。

https://trac.cakephp.org/ticket/4652
0871nobodyさん2008/05/26(月) 19:38:42ID:???
ありがとうございます!

RORから使われているカウンターキャッシュという一般的な用語があったのですね。
ここをみて理解できました。

http://blog.matsimitsu.nl/code/163/cakephp-countercache

behaviorを使ってカウントをインクリメントするのですね。この方法が一般的な方法で
あるとわかっただけでも安心して使えそうです。色々とありがとうございました。
0872nobodyさん2008/05/26(月) 20:20:41ID:???
要するに、cakephpのリレーションはデータ無駄にとってくるけどなんなの?って質問か。
cakephp recursiveとかでググれ。変だから。

0873nobodyさん2008/05/27(火) 01:20:24ID:Dti8RTlW
そういえば毎回、findやfinallするときに引数$recursive指定するのってメンドイよな。
クラス化してメソッドを細分化したときなんてとくに、recursiveのパターン数でメソッドを
さらに分解してしまうと大変なことになってしまう。
getPostWithComments() とかgetPostWithoutComments()とか。
0874nobodyさん2008/05/27(火) 03:10:59ID:???
なんかその設計が悪いんじゃないの・・
0875nobodyさん2008/05/27(火) 03:42:15ID:???
ビジネスロジックを律儀にmodelに入れてる悪寒
適度で良いんだよそんなの。細分化うざい。Controllerでやれ。

それでもやっぱりビジネスロジックまとめたいというなら
modelとcontrollerの間にservice層入れる。

が、そんな規模のものはcakephpは想定してないんじゃないかね。
0876nobodyさん2008/05/27(火) 13:21:52ID:???
>>875
そういう問題じゃない。

getPostWithComments() とかgetPostWithoutComments()という
メソッドが出来てしまう問題はロジックを置く場所を変えても
どっちみち出来てしまうだろ。

これはrecursiveの違いでメソッドを作るか、
引数(プロパティ設定も含む)で指定するかの違いだよ。

関数作るのが嫌なら、getPost(withiCommentsを意味する引数);とするか
$this->プロパティ = withiCommentsを意味する値; getPost();
とするしかないんじゃね?

ビジネスロジックではなく、どこまでデータを拾ってビューに渡すかの処理と
考えれば、コントローラーで取得するデータの範囲を決めるのもまずくは無い。
0877nobodyさん2008/05/27(火) 13:44:51ID:???
その通りだと思う。悪寒の憶測で話したからずれたんだな。

CakeのModel拡張して、Withで同時に拾ってくるようなマジック関数入れると
もっと綺麗かなと思った。findBy的な。

0878nobodyさん2008/05/27(火) 14:40:04ID:Dti8RTlW
先ほどの質問>>873を同僚に話したところ、ビヘイビア使えば?と言われてしまいました
0879nobodyさん2008/05/27(火) 18:20:37ID:???
behaviorって1.2から導入されたのか。
1.1しかいじってなかったのでピンとこなかったよ。
0880nobodyさん2008/05/27(火) 23:04:56ID:???
>>878
ビヘイビアですか・・・?

出来ないことは無いとは思うけど、
でもそれ、なんて名前のビヘイビアになるんだろう。

(名前がわかれば、ビヘイビアにするのが妥当か判断できる)
0881nobodyさん2008/05/30(金) 15:00:54ID:xGH68yw0
■PostgreSQLを使ったときのバグ 1.2.0.6311 beta(と最新のブランチ)で確認

$model->create();
$model->save(data)
をしたとき、以下の二つのSQL文が発行される

1 INSERT INTO "models" (〜〜) VALUES (〜〜)
2 SELECT last_value AS max FROM "models_id_seq"

問題は、2行目、データをインサートしてから、シーケンスの最大値を取得している。
これは新たに作成された $model->id を取得する為だが、
この処理が二つのセッション(AとBとする)で同時に実行された場合、

A-1 INSERT INTO "models" (〜〜) VALUES (〜〜) //シーケンスの値が1になる
B-1 INSERT INTO "models" (〜〜) VALUES (〜〜) //シーケンスの値が2になる
A-2 SELECT last_value AS max FROM "models_id_seq" //本来は1であるはずが2を取得
B-2 SELECT last_value AS max FROM "models_id_seq" //2を取得

となる場合が発生し、A-2で取得される値が正しくない。

一日に数回しか注文が無いのに、たまたま同時刻の注文とその明細が一つずれたorz
(ベータ使っている俺が悪いんで、別に恨みませんけど。自社システムだし。)

これどうすればいいのかな? 単純にcurval()を使えばいいのかな?

MySQLに関しては、SELECT LAST_INSERT_ID() AS insertIDを使っているので
問題は無いはず。その他のデータベースまでは見ていない。

えーと、それからアカウント持っている人
だれか公式に英語で伝えてください。お願いします。

あと、説明これで間違って無いと思うけど自信は無い・・・
0882nobodyさん2008/05/30(金) 15:33:24ID:???
こんなのがあった。おかしいなぁ?昔はcurrvalを使っているのに・・・?

どういうこと? なんか別の問題でもある?

https://trac.cakephp.org/ticket/381 currval()になっている。

https://trac.cakephp.org/ticket/598 このパッチでmax()になった?
0883nobodyさん2008/06/02(月) 22:09:13ID:???
1.2 stable キターーーーーーー!!!











という夢を見たw
■ このスレッドは過去ログ倉庫に格納されています