【PHP】フレームワーク CakePHP 12ホール目【笑】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/07/01(金) 16:33:46.28ID:???CakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう
※sage推奨
※質問時もsageること
※他フレームワークとの比較等はスレ違いです
テンプレは>>1-5くらい
■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
the Bakery
http://bakery.cakephp.org/
CakeQs
http://cakeqs.org/
CheatSheet (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
github - cakephp
http://github.com/cakephp
■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
http://book.cakephp.org/ja
前スレ
【PHP】フレームワーク CakePHP 11ホール目【v1.3】
http://hibari.2ch.net/test/read.cgi/php/1297860755/
0756nobodyさん
2011/10/20(木) 22:47:59.02ID:???今やWordPressだって5.2以降だ
0757nobodyさん
2011/10/21(金) 00:12:41.15ID:???1テーブルへの保存は素直にモデル使う方のが楽だけど
0759nobodyさん
2011/10/21(金) 09:56:11.01ID:???直書きするしかないだろうか
0760nobodyさん
2011/10/21(金) 10:11:15.02ID:???みたいにするとき、SQL直書きしちゃうな。
0761nobodyさん
2011/10/21(金) 12:54:50.68ID:???0762nobodyさん
2011/10/21(金) 16:24:09.04ID:???簡単に実装できそうな気がするんだけどな
なんでできないんだろ
0763nobodyさん
2011/10/21(金) 17:40:19.31ID:???0764nobodyさん
2011/10/21(金) 18:24:38.42ID:???どうしたら良いんでしょうか?username, emailのみ残したいんですが。
0765nobodyさん
2011/10/21(金) 18:31:44.77ID:???$model['User']['email'] = $this->Auth->user('email');
これだとちょっと無駄な気がしまして。。
0766nobodyさん
2011/10/21(金) 18:39:25.50ID:???一度、自分で作ってみりゃ分かるよ。
まぁ、作る気もないのなら
http://gihyo.jp/dev/serial/01/cakephp/0015
^ここらへん見てみれ。
cookbookだかCakePHPの公式の文書あたりでもページネーションの難しさを論議してた所があった気がするが、文句言うくらいなら少しは自分で考えてみるべし。
0767nobodyさん
2011/10/21(金) 19:31:44.18ID:???ArraySource使えば一瞬だろうに
>>764
array_intersect_key($user, array_flip(array('hoge', 'fuga', ...)))
>>766
的外れだと思う。
というかずっとカスタムページネーションをモデルで実装することがなんで今までほとんど
話題に挙がってないか不思議すぎる。
0768nobodyさん
2011/10/21(金) 19:39:21.27ID:???的外れだと思う。
>というかずっとカスタムページネーションをモデルで実装することがなんで今までほとんど 話題に挙がってないか不思議すぎる。
何言っているのか分からない。
モデルを作ると半ば自動的にページネーションを使えるようになっているわけだが、「モデルで実装することがなんで今までほとんど話題に挙がってないか」の意味は、どういう意図なのでしょうか?
かなり昔にいじっていたsymfonyのページネーションだと、全体件数のsqlやら、ソートしなおす場合のsqlのテンプレートやら、カスタムsqlだとかなり色々いじる必要があったが、そこらへん理解できますか?
0769nobodyさん
2011/10/21(金) 21:13:36.76ID:???モデルとRDBを結び付けてたみたいだけど、モデルってRDB以外にもデータソース割り振れるんよ。RDBばっか使ってるから忘れてる事多いけど。
探せばRDB以外でもページネーションしてるの見つかると思うからそれ参考にすりゃ、作れると思うよ。
っつか、そもそもSQLでかたつくもんなら、そんな面倒な事考えないでRDB側でビュー作っちまうのが手っ取り早いな。
0770nobodyさん
2011/10/21(金) 22:00:39.54ID:???どうdataを形成したらうまく保存できるか分からないのですが、
教えていただけませんか?
0771nobodyさん
2011/10/21(金) 23:02:54.99ID:???なんでsymfonyが出てくるの
そもそも「カスタムページネーション」が示すのがわかってない?
paginate()とpaginateCount()をモデルで実装するということを指している。
あとデータソースレベルで解決できるならRDB以外でページネーションする場合もモデル
のコードは変わらんのだけど。。
>>770
$data['Tag']
or
$data['Tag']['Tag']
に入れれば、っていう話ではない?
0772nobodyさん
2011/10/22(土) 01:02:03.70ID:???0773nobodyさん
2011/10/22(土) 03:23:07.96ID:???0775nobodyさん
2011/10/22(土) 11:39:01.24ID:???おまいさんの目は節穴か?答え書いてあるじゃん。
0776nobodyさん
2011/10/22(土) 15:26:28.98ID:???俺は答えが書いてないなんて言ってないよ。。
何回も話がループしてる中でなんでその答えを指し示さないの?って思っただけだよ。
それをしないで謎の方向で議論が進んでるからおかしいなと。
というか、こういう行間の読み合いって不毛すぎるよね。やめよう。
0777nobodyさん
2011/10/22(土) 15:51:22.50ID:???マニュアルやらいろんな方向性を教えてもらって結構時間経ってるのにまだ解決方法を求めてるとか、
プログラムとか全くできない人だろ。
0778nobodyさん
2011/10/22(土) 15:52:50.71ID:???詰まったところを公式のマニュアル見て理解するって場面が数カ所あったし
0779nobodyさん
2011/10/23(日) 11:03:45.45ID:???頓挫しちゃったの??
すごい期待してるのに・・・
0780nobodyさん
2011/10/23(日) 16:55:28.79ID:???0781nobodyさん
2011/10/23(日) 17:27:15.31ID:???いろいろと中途半端なかんじ・・・
0782nobodyさん
2011/10/23(日) 21:41:36.49ID:???0784nobodyさん
2011/10/24(月) 12:22:12.00ID:???「掲示板に投稿しているユーザのプロフィールを表示」
ってな用途で利用しようと、上記の流れでアソシエーション(belongTo)
を組んでいるが、難しすぎるな・・。思うようにデータが取れない。
素直にjoinsオプション付けてfindした方がいい気がしてきた
0785nobodyさん
2011/10/24(月) 13:54:52.39ID:???0786nobodyさん
2011/10/24(月) 13:56:47.44ID:???俺の場合、afterFind入れてるからか、なぜかエラーになる。
エラーを解決する方法もわからないので、>>784の考えに至った。
0787nobodyさん
2011/10/25(火) 03:56:26.02ID:???0788nobodyさん
2011/10/25(火) 05:44:45.74ID:???/diary/detail/1/10
みたいになるんだが、非常に違和感を感じるのは俺だけか?
一応、/diary/1/detail/10 みたいにルーティングしているけど・・・
0789nobodyさん
2011/10/25(火) 18:24:42.41ID:???B belongsTo A 、C belongsTo A
B HABTM D、C HABTM E
以上の構成で、D、Eのカラムを検索条件にする時、どう検索したら良いでしょうか?
よろしくお願いします。
0791nobodyさん
2011/10/25(火) 20:33:25.78ID:???これをpaginateするにはどうすればいいのでしょうか?
もし参考サイトをご存じの場合は教えてください。
0792nobodyさん
2011/10/25(火) 20:55:18.02ID:???俺なら日記の記事ページのURLは、user_idを飛ばして/diaries/view/10にするか、
ユーザーネーム使って/(user_name)/diary/10か/diary/(user_name)/10にする
user_idをURLに含めるのはダサい
どうしてもユーザーID入れたいならnamedパラメータ使って/diary/view/user_id:1/diary_id:10とかだな
0794nobodyさん
2011/10/25(火) 21:16:55.95ID:???まあ1.2系のままだから1.3にはしておいてもいいだろうけど、ファイル名のパターンからディレクトリ構造まで大幅に変わってて簡単にアップグレードできんわな(´・ω・`)
0795nobodyさん
2011/10/25(火) 21:17:53.85ID:???ブログのアカウント的な感覚でuser_nameと言ったのか。
ま、それなら道理はわかるんだけどな。
user_idをURLに含めるのは確かにダサいんだが、
ユーザ専用ページを作成している場合は仕方ないんだよな。
mixiでもuser_idがURLに付加されているし。
0797nobodyさん
2011/10/25(火) 22:52:17.90ID:???システム的には大きく変わってないのに、ファイル構造は大きく変わったよね
規約にPSR-0を起用したせいだろうけど、なんだか慣れないせいか気持ち悪い
>>795
基本的にdiary_idがわかればuser_idも引っ張ってこれるんだからdiary_idさえあれば問題ないと思うけどね
urlにuser_idが含まれていても、そのIDが有効かどうかのチェックは必要だし
どちらにせよ何かしらの事情でuser_idがURLに含ませたいのなら>>792の最後の案だな
0799nobodyさん
2011/10/26(水) 14:55:11.47ID:???Post hasAndBelongsToMany Tag として、タグが設定されていない投稿を取得したいんです。
0800nobodyさん
2011/10/26(水) 15:20:32.44ID:???少々複雑だが
http://d.hatena.ne.jp/kanonji/searchdiary?word=%2A%5Bphp%5D
0801nobodyさん
2011/10/26(水) 20:02:12.45ID:???ってコントローラーで指定できませんよね?
0802nobodyさん
2011/10/27(木) 02:11:13.69ID:???何か理由があるのかね?
0803nobodyさん
2011/10/27(木) 03:45:34.56ID:???0804nobodyさん
2011/10/27(木) 10:46:16.71ID:???処理した内容を return で返してもデータが反映されず困ってます。
試しに return を null にしてもちゃんとデータを引っ張ってきてしまいます。
afterFind メソッドは叩かれてるようなんですが、戻り値を使っていないという感じです。
ちなみに直接 Find するとちゃんと戻り値が反映されます。
解決方法はありますでしょうか?
0805nobodyさん
2011/10/27(木) 11:10:43.00ID:???0806nobodyさん
2011/10/27(木) 11:28:25.45ID:???ソースというか、それ以前なんです・・・。
上の質問で試したソースです。
よろしくお願いします。
class Post extends AppModel {
var $hasMany = array(
'Postmeta' => array(
'className' => 'Postmeta',
'foreignKey' => 'post_id'
)
);
}
class Postmeta extends AppModel {
function afterFind($results, $primary) {
return null;
}
}
これで Post->find('all') すると return null してるから Postmeta は空、と思ってるんですが反映されません。
0807nobodyさん
2011/10/27(木) 11:48:38.50ID:???0808nobodyさん
2011/10/27(木) 12:04:17.04ID:???やっぱり hasMany はだめなんですか?
たしかに HABTM だとちゃんと意図した通りになるんです。
それで hasMany でも同じだと思ってたんですが・・・。
0809nobodyさん
2011/10/27(木) 13:30:57.05ID:???まちがってるね。
最初が大文字はPascal(パスカル) 形式
最初が小文字がCamel(キャメル) 形式
0810nobodyさん
2011/10/27(木) 14:05:35.88ID:???lowerCamelCase
0811nobodyさん
2011/10/27(木) 16:50:04.82ID:???0813nobodyさん
2011/10/27(木) 19:49:58.61ID:???ディレクトリ構造が複雑になって辛い・・・
0814nobodyさん
2011/10/27(木) 20:30:53.17ID:???controllerで設定したlimitを上書きしちゃうんだけど、URLからのパラメータ指定を
無効にするにはどうしたらいいの?
0816nobodyさん
2011/10/27(木) 20:58:48.27ID:???たしか2.0から無効になるパラメータがあったはず。
1.3以前なら無理だと思う。素直に自分で上限付けるべき。
0817nobodyさん
2011/10/27(木) 23:58:13.08ID:???ありがとう。2.0の変更内容を見ていてはじめて、URLパラメータでlimitが任意で指定できることを知った。
limitに1000000とか指定されても迷惑なので、paginateのwhitelistにきちんと値を設定することにするよ。
0818nobodyさん
2011/10/28(金) 03:53:00.84ID:0WPYyAnpCakePHP2.0使おうかと思ってるんだけどどうっすかね?
Web APIの数は数十本くらいになると思うんだけど
その程度でCakePHPはやめとけとか他のフレームワークの方がいいよとか
意見聞かせてください。
0819nobodyさん
2011/10/28(金) 03:59:15.54ID:???0821nobodyさん
2011/10/28(金) 06:51:50.59ID:???お前らコレ使ってる?
なんか複雑なクエリ発行したいときに便利そうだが
0822nobodyさん
2011/10/28(金) 09:40:50.71ID:???言葉が足りなかった。件数の設定をやめさせる、というわけではないよ。
コントローラでlimitをパラメータから取得して、paginateのオプションに
明示的に設定してから、paginateを実行する。
0823nobodyさん
2011/10/28(金) 11:33:30.55ID:k+uCwlGG0826nobodyさん
2011/10/28(金) 14:26:18.96ID:???0827nobodyさん
2011/10/28(金) 15:09:23.87ID:???時々Containableでは賄いきれなくてbindModelとか使うはめになるとチッって思う。
0828nobodyさん
2011/10/28(金) 16:10:21.67ID:???色々付けたり外したりしてると、わけわからんようになってくるしw
0829nobodyさん
2011/10/28(金) 16:33:42.39ID:???わかりやすく説明して賢い人!
0830nobodyさん
2011/10/28(金) 16:54:11.63ID:???0831nobodyさん
2011/10/28(金) 17:45:15.20ID:???bind,unbindするより500倍扱いやすい
http://book.cakephp.org/ja/view/1323/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%A4%E3%83%8A%E3%83%96%E3%83%AB
>コンテイナブルを使わないならモデルの unbindModel() を使用することになります。複数のモデルを切り離すなら、
>unbindModel() を何度も実行しなければなりません。コンテイナブルによって同じことをより簡潔に行えます。
0832nobodyさん
2011/10/28(金) 18:19:37.84ID:???関連付けってアソシエイションのことだよね?
関連付けたモデルを取得しないってのは
recursiveでやるじゃなかったっけ?
0833nobodyさん
2011/10/28(金) 18:33:08.66ID:???groupオプション(GROUP BY)付けてページネートしてみて
ページが1ページしかないように返してくるから
これってバグだよね?
ググってみると、
http://d.hatena.ne.jp/aroundthedistance/20090728/1248784179
こんな記事もあるんだけど、
2009年の記事なのに未だに(1.3使用)直ってないってこと?
0834nobodyさん
2011/10/28(金) 19:31:34.10ID:???0835nobodyさん
2011/10/28(金) 22:04:00.46ID:???0836nobodyさん
2011/10/28(金) 22:14:35.50ID:???検索して、ヒットしたブログ記事を参考に実装してた。
0837nobodyさん
2011/10/28(金) 23:14:17.04ID:???recursiveでもできるよ。
だけど、containableを使うともっと細かく制御できる。
例えば、
usersテーブルに
hasOneでprofilesテーブルと
postsテーブルが
関連付けされててusersとprofilesだけ欲しい場合
$this->Users->find('all', array('contain' => 'Profile'));で取れる。
0838837
2011/10/28(金) 23:20:05.03ID:???$this->Users->find('all', array(
'contain' => array(
'Profile' => array('State')
)
));
で取れる。
0839nobodyさん
2011/10/29(土) 02:46:57.22ID:???誰かこれどう?1.3以上の人試してくれない?
コントローラの設定で、
var $paginate = array(
'Model' => array(
'group' => 'Model.id',
'order' => 'Model.id DESC',
'limit' => 5,
)
);
としてみるだけでいい
ページネーションのページ数が1になる
(ページ数(pageCount)が入っている配列はView内で $paginator->params() で取得可能)
0840nobodyさん
2011/10/29(土) 02:54:42.55ID:???・paginateメソッドがgroupに対応するとより複雑なグルーピングなどに対応できないなどの
拘束が生まれるので仕様
・バグじゃないから直らない
・記事の通りコールバック書け
0844nobodyさん
2011/10/30(日) 09:00:13.02ID:???40画像ぐらい表示させると、表示しない画像がちらほら出てくる・・・
実装としては、大きな画像をサーバ上に置いて、
・<img src="<?php echo $html->url('/thumbnails/view/1234'); " />
のようにimgタグでコントローラにリクエスト
・渡されたIDをもとに画像のパスが保存されてるテーブルをfind()
・その画像からサムネイルを生成して返す
という感じ。
1人がアクセスするたびに、40個画像があれば、
CakePHPが40個起動するのはやっぱりこの実装は問題ありなのかな?
同時接続数にひっかかってる気もする
ちなみに ZOZOTOWN(http://zozo.jp)はCakePHPではないと思うけど、
上記のような感じでアクセスされて生成している模様
0845nobodyさん
2011/10/30(日) 10:55:31.34ID:???実装に問題あり。
0846nobodyさん
2011/10/30(日) 12:54:12.82ID:???0847nobodyさん
2011/10/30(日) 18:03:57.54ID:???0848nobodyさん
2011/10/30(日) 23:20:56.06ID:???サムネイルキャッシュは公開ディレクトリに置くか、tmpディレクトリに生成して生PHPで読みに行かせるのがいいと思う
0849nobodyさん
2011/10/31(月) 00:54:49.04ID:???Mediaビューが便利。
0850844
2011/10/31(月) 06:30:50.20ID:???>>845
してると思います
ただ、生成したあとキャッシュしてるかもしれませんが、、、
http://imgc.zozo.jp/goodsimages/2207214/2207214_18_D.jpg?w=70&h=84
例えばこの画像だけど、
wやhの値を変えると、その大きさになります
http://imgc.zozo.jp/goodsimages/2207214/2207214_18_D.jpg?w=111
こんな感じで適当な値を全て保存してるはずないので
アクセスしたときに生成してるんだと思います
>>846
はい、最初はそう考えましたが、
様々な大きさにフレキシブルに対応したいと思って、
>>844のような実装にしたくなったのです
一度生成した画像はそのまま保存して、
その大きさの画像があれば、その保存したものを取りに行くという実装にしようかな?
ZOZOTOWNのような人気サイトはどう対応してるのか・・・
0851nobodyさん
2011/10/31(月) 07:09:00.82ID:???後は自分で考えなさいな。CakePHPはそこまでお世話できないよ。
0852nobodyさん
2011/10/31(月) 12:08:18.41ID:???そりゃ、サイズを入力したらそのサイズで表示(生成)されるよ。
でも、基本的にはショッピングサイトの画像サイズなんて決まってるから、
サイトで使用する画像だけ先に生成されるようにしてるんだろ。
だから、1アクセスで全ての画像を作成するんじゃないと思うよ。
0853nobodyさん
2011/10/31(月) 12:13:10.79ID:???0854nobodyさん
2011/10/31(月) 14:39:06.95ID:???User が複数の Item を持っているという仮定で、以下のようにすると Apple か Orange のいずれかをもつユーザーが抽出されます。
$options['joins'] = array(
array(
'table' => 'items',
'alias' => 'Item',
'type' => 'INNER',
'conditions' => array(
"Item.user_id = User.id"
)
)
);
$options['conditions'] = array(
'OR' => array(
'Item.name = "Apple"',
'Item.name = "Orange"',
)
);
$users = $this->User->find('all', $options);
これを Apple と Orange 両方持つユーザーを抽出したい場合どうしたらいいでしょうか?
MySQL のクエリは素人同然ですが、なにかヒントなどでもありましたらアドバイス下さい。
0855nobodyさん
2011/10/31(月) 18:48:00.13ID:???いつごろでるか予定は発表されてますか?
0856nobodyさん
2011/10/31(月) 19:36:30.56ID:???■ このスレッドは過去ログ倉庫に格納されています