ラベル cakePHP の投稿を表示しています。 すべての投稿を表示
ラベル cakePHP の投稿を表示しています。 すべての投稿を表示

2012/09/21

[CakePHP] 関連したデータの取得を簡単にしてくれるビヘイビア「Containable」


CakePHPで、テーブルを結合してデータを取得するにはモデル内に関連付けの設定を書いておく。
http://book.cakephp.org/1.3/ja/view/1039/%E9%96%A2%E9%80%A3-%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E7%B5%90%E3%81%B3%E3%81%A4%E3%81%91%E3%82%8B

これだけで完結できればいいんだけど、そういう訳にもいかない。
状況によっては結合する必要のない(又は必要のある)テーブルやカラムもある。
findのオプションでjoin指定したりするのも面倒&複雑。

しょうがないので、状況に合わせてbindModelしたりunbindModelしたりしてた。
どうにか楽にしたいなーと思ってたら、たまたまどっかのブログのコメント欄で見かけた機能。
Containableビヘイビア

http://book.cakephp.org/1.3/ja/view/1323/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%A4%E3%83%8A%E3%83%96%E3%83%AB

これを使うとかなり条件指定がシンプルにできる
$this->Model->find('all', array(
 'contain' => array(
  'Model1' //これでModel1を結合
  'Model2' => array(
   'fields' => array('column1', 'column2') //取得するカラムも指定できる
  )
  'Model3' => array(
   'Model4' => array( //さらにテーブルを連結することもできる
    'fields' => array('column1') //もちろんカラム指定も
   )
  )
 )
));

かなり楽!
Cakeのマニュアルの「主要なビヘイビア」ってとこに紹介されているくらいなので、知ってて当然の機能…。
マニュアル読むのを面倒くさがると後になって余計に面倒なことになったりするよね。
知ってて当然の機能かもしれんが、コレを知った時はちょっと感動した。

2012/09/13

[CakePHP] selectリストで指定のoptionをselectedにしたい

//CakePHP2.*

//コントローラー側
$this->set('cars', $this->Car->find('list'));

//ビュー
$this->Form->input('Car', array(
 //値が1と2のものをselectedにする。もちろん値は1つでもOK
 'value' => array(1, 2)
));

2012/09/07

[CakePHP]コンポーネント内でモデルを使う

コンポーネント内でモデルを使いたい場合、通常なら
App::uses('MyModel', 'Model');
$model = new MyModel();
すればいいんだけど、そのインスタンス化するモデル内でApp::usesを使っていたら、そこがエラーになってしまった。
原因を調べてたところ、モデルを使う他の方法を見つけたのでそちらを試す。
参考:コンポーネントでモデルを使う - by shigemk2
//コンポーネントファイル内
pulic function initialize(Controller $controller){
 //コントローラを変数に格納
 $this->controller = $controller;
}

public function myMethod(){
 //コントローラ内で使用しているモデルを使う
 $this->controler->MyModel->find('hoshii-data');
}
コントローラとの関連が濃すぎると感じたが、こういうやり方があんだなーと感心しつつ、真似して実装。
使ってみたら、いやー便利!
と思ったところで、上記のページの最後の行を見落としてたことに気づいた。
追記:基本的にコンポーネント内でモデルを使う事は推奨されていないので、極力使わない方向でいく。
あれー!
とりあえずはApp::usesがエラーになった理由&なんでコンポーネントで使っちゃだめなの?&他の方法を探そう

2012/07/24

[CakePHP] アソシエーションでデータを取得すると、joinして取得する場合とSQLを別で発行する場合がある


結びついてるテーブルを全部JOINで取得するもんだと思って、conditionsにjoinされる(と思っていた)テーブルのカラムで条件を指定したらエラーになった。

いっつもjoinされないわけでもなくて、joinされて来る時もある。
どういう理由かわかんなくて、一番パフォーマンスが良い方法を自動で選んだりしてくれてるのかしら?なんて思ってたけど違うみたい。

参考:SQLから考えるModel::findの使い方

hasManyだとjoinしないでbelongsToだとjoinするってよ。
分かればまあ、使いわけられるかな。

2012/06/01

[CakePHP] cssをhead内に追加する

マニュアルに書いてはいるんだけど、見つけるのに時間かかったのでメモ。 テンプレごとに読み込むcssファイルを指定する場合、はテンプレート側にcssの記述を追加する。 Htmlヘルパーを使うんだけど、そのままechoすると、その記述をした箇所(body内)にlinkタグが追加されてしまう
//オプションにinline = false を追加する
$this->Html->css('ファイル名', null, array('inline' => false));
//1.3以前だと$html->css(****って書けばいい

2012/05/23

[cakePHP] テンプレートを使わない場合

json返すだけとか、テンプレート使わない場合
$this->autoRender  = false;
参考:CakePHP ~を使わないシリーズ viewをつかわない

[cakePHP] cakePHP2.0で404エラーを出したい

以前はコントローラーで
$this->cakeError('***');
でエラーになってたんですが、バージョン2は変わってました
throw new NotFoundException():
新しく出来た例外のクラスをthrowするようになってました。

2012/03/23

[cakePHP] 基本機能

cakephp2を触ってるんだけど、色々と書き方なんかが変わってきているのでメモ

--------------------------
★コントローラー

■モデルの使用
$this->loadModel(モデル名);

■とりあえず追加・更新・削除機能を動かしたい場合
class UnkoController extends AppController{
    //↓$scaffoldを記述
    public $scaffold;
}
テスト用に自動で基本的な機能を使えるようにする機能であって、実際の運用には使わないほうがいいよって言われてます。

--------------------------
★モデル

■デフォルトの並び順を設定する
//モデルクラスに$orderという変数を作成する。値はSQLのORDER文
public $order = 'ModelName.created ASC';

--------------------------

★ヘルパー

◎Formヘルパー
■formの閉じタグとsubmitボタンを表示する
//Form->end()の引数に文字列を渡すとその文字列がvalueになったsubmitボタンが自動で作られる
$this->Form->end('submit');


--------------------------
随時追記していく予定

2012/03/02

CakePHP2.0でのリダレクトエラー


CakePHPの2.0でリダレクトしようとした際に画面が真っ白になってしまった。
調べたところ、headerを返す前になにか出力してしまってるんじゃないかとのこと。

探してみたが何も出力していない。
Debuggerでなにかしようとしているということはわかった。

とりあえずcore.phpのデバッグレベルを0にすると起きないということだけわかった。
もうちょっと調べてみよう。

参考にしたサイト:

2012/02/07

[CakePHP] Ajaxによるアクセスかどうか判定する


Ajaxからのアクセス以外は許可したくない時など

//RequestHandlerコンポーネントを追加
public $components = array(
'RequestHandler'
);

public index(){
if($this->RequestHandler->isAjax()){
//Ajaxの場合
}else{
//それ以外の場合
}
}

俺の場合はAjaxのアクセスしか許可せず、それ以外は404にすることが多い

2011/12/09

[CakePHP] ビューで共通に使う素材を作成する

CakePHPではメニューとか、フッターとか、共通で使う部分を1つのファイルとして作成して、共通で使いまわすエレメントってのがある。

設置場所:/app/views/elements
拡張子はctpにする。

・呼び出し方(ビュー内)
$this->element('parts');
これで/app/views/elements/parts.ctpが読み込まれる

・変数を渡して、エレメント内で使用できる
//ビュー側
$this->element('parts', array(
 'value' => 100,
 'key' => 'お小遣い'
));
//エレメント側
は円です


参考:
CakePHPマニュアル 3.10.3 エレメント

2011/12/01

[CakePHP] 別のテンプレートを使いたい場合

条件によって、使用するテンプレートを切り替えたい場合などに

$this->render('template_2'); //この場合はtemplate_2.ctpが読み込まれる
参考: ビューテンプレートの変更方法

2011/11/30

[CakePHP] 子・孫まで。複数の入れ子になったモデルを連結して取得したい

cakePHPでデータを取得する際にhasManyなどの子のモデルに、更に孫のモデルをくっつけて取得したくなった。

・モデルで指定する場合
$recursive = 2; //これで2階層目まで取得する

・コントローラで指定する場合
$this->Model->find('first', array('recursive' => 2);
両方とも、数字を変更すれば取得しにいく階層の深さが変わる

参考:
CakePHPで3つ以上の複数テーブルを結合

[CakePHP] 404ページを表示したい

CakePHPで404ページを出したい時は…

/app/view/errosディレクトリにerror404.ctpファイルを設置する。

だけ。


レイアウトを変更したい場合なんかは、app直下にerror.phpというファイルを作って、その中で色々と処理をすればいいらしい

コントローラー側では
$this->cakeError('error404');
と書く。

参考:
CakePHPで404エラー画面を作る

cakeのバージョンは1.3です

2011/11/16

[CakePHP] コントローラー内で共通の処理をまとめる

コントローラー内で共通の処理をまとめることができる

1.beforeFilter()
それぞれのアクションが実行される前に呼び出される

2.beforeRender()
アクションを実行した後に呼び出される

3.afterFilter()
レンダリングも終了した後で呼び出される


呼ばれる順番は
beforeFilter()
↓
アクション
↓
beforeRender()
↓

レンダリング
↓
afterFilter()

2011/11/15

[CakePHP] urlで渡されたクエリパラメーターの値を取得する

CakePHPでURLで渡されたパラメーターの値をコントローラーで取る方法

http://sample.com?value=100
↑の100って値を取得したい場合

$this->params
にいろんなパラメーターが入っている

URLで渡されたデータは
$this->params['url']
で取れる

上の場合だと
$this->params['url']['value']; //100


他にもう一つ
http://sample.com/10/12
みたいに値だけ渡すことも可能

その場合は

public function action($param1, $param2){
 //ここで処理
}
というふうにコントローラーのメソッドの引数で受け取れる

2011/08/09

[cakePHP] MVC設計ってまだ把握できとらん…

CakePHPを使ったMVC設計のベストプラクティスを読んで、一度読んだだけではなにがどうなったのかよくわからんかったので、自分なりにまとめてみた。


■コントローラーが変更された点
・共通したorder指定を抜き出してモデル側で設定
・データを取得して表示するという流れは同じなので、アクションを1つにまとめた
・件数指定部分をモーフィングっぽく配列に格納
・モデルにオプションを渡して取得できるようになった
・渡されたパラメーターによって自動で処理が変わるようになった


■モデル
・並び順のデフォルト設定追加
・人気順で取得する機能追加
・特定の設定はモデル側でもっとく



■要点
・MVCではモデルが一番大事
・コントローラーはモデルとビューをつなぐシンプルな糊
・モデルに置けるものはモデルに置く
・ビジネスモデルと連携しないもの(セッション管理・リクエスト、レスポンス処理・セキュリティ、アクセス制限関連)はコントローラーに置く。(それ以外は全部モデルに置く)



参考
CakePHPを使ったMVC設計のベストプラクティス

2011/08/03

[cakePHP] モデルのルール

-クラス
必ずAppModelを継承して作成する

-モデル名の定義
public $name = 'モデル名';
モデルの名前を定義する
単語の頭文字は大文字

とりあえずはこれだけでAppModelにあるいろんな機能が使える

AppModelは/cake/libs/model/app_model.phpにある
中身は空っぽで、ここに追加した機能は、コレを継承する全モデルで使えるようになる。
一部のモデルでしか使わない機能はここに入れたらダメだね。

一部のモデル用に共通で使える機能はビヘイビアってを使うのがいいみたい

参考
モデル :: CakePHPによる開発 :: マニュアル :: 1.3コレクション

[cakePHP] レイアウト・テンプレートに実行したSQLを表示する

cakePHP 1.3でやってます

まずはアプリケーションのデバッグモードを変更する
/app/config/core.php内の
Configure::write('debug', 0);
を
Configure::write('debug', 2);
に変更する。
これでテンプレートにSQLが表示されるようになる

■レイアウトを変更したい場合。
デフォルトのレイアウトを変更したい場合は、/app/views/layouts/にdafault.ctpを作成すればよい。

実際そうしてみると、デフォルトの時は出ていたSQLがでなくなった
その場合は自分で作ったdefault.ctpに
$this->element('sql_dump');
を追加する。


参考
CakePHP での実行した SQL の表示

2011/08/02

[cakePHP] テーブルにprefixをつけている場合の外部キー・カラム名

cakePHPで外部キーを作成する場合、カラム名には制約がある。(制約以外の名前でも使用することはできる)

マニュアルより::
現在のモデル名のアンダースコア区切りの単数形で、末尾に‘_id’をつけたものです

今回、データベースの設定でテーブル名に接頭辞をつけるようにしていた。
mmm_usersテーブルとmmm_profilesテーブルを関連付けたい。

こういう場合も外部キーにするカラム名には接頭辞であるmmmはつけない
mmm_profiles.user_id
にする