HasManyしているモデルを、コントローラー内で 動的に条件を指定してやりたい。 $this->[モデル名]->hasMany['関連モデル名']['conditions'] = '関連モデル名.del_flag = 0'; $data = $this->[モデル名]->findAll()); これでいけましたよ。と。 $this->[モデル名]->hasMany['関連モデル名']['conditions'] = null; で戻してやったほうがいいかな。
普通にラジオボタンを下記のように作る時は問題ないのですが $form->input("User.sex", array("type" => "radio","options" => array('1'=>'男性', '2'=>'女性'))); デザイン的にラジオボタンを分けて表示したい時があります。 とりあえず次のようにしてデザインの埋め込みたいところに記述します。 $form->input("User.sex", array("type" => "radio", "options" => array('1'=>'男性'))); $form->input("User.sex", array("type" => "radio", "options" => array('2'=>'女性'))); そうすると両方にhiddenのタグが付いてしまってラジオボタンの値を上手いこと取得してくれません。
PHPにcompactという関数がある。 複数の変数から一つの配列を作りたいときに使うものらしい。 例えばCakePHPでビューにデータを送るときなんかに使ったりする。 $data = $this->Model->find('all'); $this->set(compact('data')); この二行目は以下の一行と同義。 $this->set('data', $data); まあ、上記のように変数が一つしかないような場合だったらわざわざ$dataに値を入れないでsetの第二引数に直接findを書けば良いけど、複数の変数なんかをまとめてsetしたいときには、わりと便利なのかもしれない。あまり使ったことはないけど。 ただ、注意しとかなきゃいけないのは、compactする場合、変数名にアンダーバーなどを使うとキャメルケースとかいうのにされてしまうということ。 $this->set('sam
これはナイス記事。 Blacklist your model fields for save() CakePHPのModelでsave()をするとDBにデータを保存できるのですが、Postされたデータをそのままsaveに突っ込むと、思わぬフィールドまで変更がかかってしまう危険があります。これを避けるためにDB登録前に登録データをフィルタしたり、saveの引数で、登録可能なフィールド(カラム名)を配列で指定する対応があります。 Saveの引数でフィルタする場合は、DBのフィールド名を列挙した配列を与えれば、そこで指定されたフィールド以外はDBに登録されません(ホワイトリスト) ただ、これってフィールドがたくさんあった場合、列挙するのが面倒だし、たぶん登録するカラムよりも登録を防ぎたいカラムのほうが少ないことが多いと思います。ということで、登録を防ぎたいフィールドを指定してsaveする方法 $
2011年2月17日木曜日 [CakePHP] paginateでアソシエーション設定する 複数テーブルをJoinし操作する場合、通常Model内のプロパティ (belongsTo,hasOne,hasMany,hasAndBelongsTomany)にアソシエーション定義しますが、 paginateではJoinしてくれないので、bindModelで動的に定義します。 書式 $this->ModelName->bindModel($params, $reset); $params:追加したいアソシエーション定義 $reset:true=一時的に設定する、false=設定変更する(初期値はtrue) ポイントは2点 ・bindModelの引数$resetはfalseにする。trueするとページングで定義が引き継がれない。 ・paginateのrecursiveは0以上にする
連休は足の踏み場もない部屋を片付けて模様替えをしていたtanakaです。今日はCakePHPのコネタで、複数のボタンをフォームに設置する話を紹介します。 複数の送信ボタンが欲しい 例えば、更新フォームに更新ボタンと削除ボタンが欲しいとします。単にinput type="submit/image"なボタンを配置すると、サーバーサイドで、押されたボタンが判別できません。(例が強引ですみません。更新ボタンと、更新して戻るボタンとかでもかまいません。でも、この例であれば、削除ボタンをリンクにすればほぼ解決しますね。それはさておき) 2つのボタン <?php e($form->submit('更新'));?> <?php e($form->submit('削除'));?> この2つのボタンのどちらが押されたかを判別するにはname属性を追加するといいでしょう。 <?php e($form->subm
CakePHPのModelに悩む人が多いようなので、自分なりの付き合い方(考え方)をご紹介します。 CakePHP Advent Calendar 2010の3日目です。 前日の k1LoW さんのエントリ、参考になりますね。GETのフォームをdata[]でやるとURLがすんごいことになるので、ウチでは別途対応できるライブラリを作ったりしてます。 さて、3日目の今日は書きたいネタは幾つかあったのですが、「君の当たり前に僕らは感嘆させられるんだ」の精神に従って、自分なりのModelの使い方、考え方を書いてみます。 1. 適正なインターフェイスを用意して処理をカプセル化 まず基本的な考え方。 Model(に限らずですが)では、処理単位でインターフェイス(メソッド)を用意して、実装はカプセル化しておきます。 こうすることによって、Modelを利用する側(Controllerや他のModel等)は
CakePHPでデータベースのテーブルにデータを保存するには、save()を使います。 $data = array('User', array('name' => 'hoge', 'birth' => '1988-01-01', 'b_type' => 'A')); $this->User->save($data); この命令により以下のSQLが実行されます。 INSERT INTO users ('name', 'birth', 'b-type') value ('hoge', '1988-01-01', 'A'); SELECT * FROM users; id name birth b_type 1 hoge 1988-01-01 A 作られたデータをUPDATEしたい場合には、主キーの「id」を指定してsaveすればUPDATEできます。 $data = array('User',
Modelから取得したデータ配列を更に検索&抽出する必要が生じましたが、array_searchなどで対応できる範疇を超えていました。 これは独自に関数作らないとダメかなあ、と思いつつtwitterで arrayをSQLのようにサーチしたい。 WHERE public_flag=true AND created > 2010-01-01 みたいな・・・ とつぶやいたら、kaz_29さんからReplyで、Setライブラリの存在を教えていただきました。 http://book.cakephp.org/ja/view/640/Set どうやら、Set::extractの組み合わせで目的達成出来そうです。 こんなものがあったとは、CakePHP奥が深い・・・ SetのTOPページで、使い方や各メソッドの機能が一覧できないので、ざっと自分用リファレンス作ってみました。 追加 2/2 checkに補記
CakePHP DocumentのBehaviorsの項にも書いてありますが、「ある時はこういう処理をして欲しいけど、違う時は別の処理をして欲しい」みたいな話。 やりたいこと あるModelがあって、今はAという処理だけあれば良いのだけど、今後BやCという処理も増やしたい 例えば「自動販売機」というModelがあって、今は「缶を売る」という処理だけだけど、今後「ビンを売る」「ペットボトルを売る」という処理も増やしたい こんな時はデザインパターンのStrategy パターンが使えそうなのだけど、CakePHPでやる時にはBehaviorを使えば似たようなことできるのかな?と思って調べて試してみた。 CakePHPのドキュメントを確認 Behaviorsのドキュメントを読むと、 However, we may need to “detach” behaviors from our models
Jdabtw Commented on 2023.02.22 13:02 digoxin for sale lanoxin uk purchase molnunat online cheap Azwxav Commented on 2023.02.26 07:41 order generic digoxin digoxin 250 mg cheap generic molnunat Rvgruc Commented on 2023.02.28 14:53 buy carvedilol 6.25mg pill ditropan 2.5mg generic amitriptyline 50mg brand Aewnqw Commented on 2023.03.02 01:02 priligy over the counter buy motilium online cheap generic
すっかりだまされていました。 最小単位である read が一番早いと思っていたんですが。。 ソースがこんなになってました。 model_php4.php function findAll($conditions = null, $fields = null, $order = null, $limit = null, $page = 1, $recursive = null) { $db =& ConnectionManager::getDataSource($this->useDbConfig); $this->id = $this->getID(); $offset = null; if ($page > 1 && $limit != null) { $offset = ($page – 1) * $limit; } if ($order == null) { $order = arr
読書の秋、ということで週末は割と本を読む時間(と、コーヒー飲んでカフェインの摂取)が充実しているtanakaです。今回も、CakePHPのアプリケーション開発でSetクラスを使った実践テクニックを紹介します。今回はSet::mergeを取り上げます。 引数が増えすぎて困るのを何とかしたい アプリケーションの開発が進むにつれて、既にあるメソッドに入力を増やして機能を拡張する、というのはよくあることでしょう。入力を増やす典型的な方法は、引数を増やすことです。例えば引数を増やしていって次のようになったと仮定します。 <?php class Post extends AppModel { function search($title='', $tag='', $category='', $comment='', $limit=5, $start=1) { // ... 検索実行 } } (一般的に
CakePHPで、findした結果をidをキーにして配列にしなおすという作業は割とやる作業かと思います。普通にループさせて組むと以下のような感じでしょうか。テーブルは下記のような感じで。 +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | data | varchar(255) | NO | | NULL | | +-------+--------------+------+-----
先日の第4回 CakePHP 勉強会で発表した内容でもあるのですが、簡単に SoftDeletable Behavior の使い方をまとめました。(少しだけ発表ないようにない追加情報もあります) SoftDeletable Behavior はソフトデリート(論理削除)を簡単に実現してくれる大変便利なビヘイビアです。論理削除とは DB から DELETE するのではなく削除フラグを設けて DELETE する変わりに削除フラグを立てて削除したことにすることです。 一番参考になるのはやはり Bakery です。英語が苦にならない方は私の説明よりも下記エントリを見る方がいいです。 Soft Deletable Behavior (Articles) | The Bakery, Everything CakePHP 勉強会で発表した資料は下記にありますので、よろしければこちらもご覧下さい。 Cak
Re: CakePHP修行 #011 無限リダイレクトに気をつけろ 2007-06-29 ログイン画面を作っていくぞ、と(CakePHP修行 #011) | i d e a * i d e aで、ブラウザのエラー画面が出たところで作業が終了しました。 ブラウザのエラーメッセージは英語で「このページは不正なリダイレクトをしています」と書かれています。リダイレクトでこういうことが起きるときは無限リダイレクトが原因だと相場は決まっています。 では、UsersControllerのコードを見てみましょう。今回の問題は無限リダイレクトが原因だろうというあたりがついていたので、すぐに原因となるコードが見つかりました。 原因となるコード UsersController(AppControllerを継承) function login() { // 略:ログイン画面を出す処理 } function bef
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く