cakephp2.doc_032
R e i - D r e a m
for Laravel
TOP > CakePHP2 > Controller関連(DB操作)
Guest
login

最終投稿日:2019年11月20日

Controller関連(DB操作)
CakePHP2.x
【テーブルへの登録】

    //トランザクションを設定する場合
    $this->モデル名->begin(); 

    $this->request->data["テーブル名"]["フィールド名"] = "ほげほげ";
    //登録するデータ領域の初期化
    $this->モデル名->create();
    //saveの際にバリデート処理をしない場合は「false」を指定
    $this->モデル名->save($this->request->data,false);

    //トランザクションを設定する場合
    //$this->モデル名->rollback();
    //トランザクションを設定する場合
    $this->モデル名->commit();

    //保存したデータのIDを確認できます
    ※echo $this->モデル名->id;

    ※トランザクションをするには Model で
        「begin」「commit」「rollback」をオーバーライドする必要があります。



【レコードの削除】

    //$id は、プライマリーキーです
    $this->モデル名->delete($id);


【検索関連】

    //$idをモデルの主キーの値とした時のレコードを取得する
    $this->[頭大モデル名]->read(null,$id);
    例)
        $result = $this->Hoge->read(null,$id);
        //Viewの項目名がテーブルのカラム名と同一ならこれでフォームに値がセットされます
        $this->data = $result;

    //テーブルのリレーショナルをするか設定(0でする,-1でしない)
    $this->[頭大モデル名]->recursive = 0;

        recursive -1 は、JOINしない。自分だけとってくる。
        recursive 0 は、自分と自分がbelongsToしているモデルだけとってくる。 
        recursive 1 は、自分とbelongsToとHasManyをとってくる。
        recursive 2 は、自分とbelongsToとHasManyと、
         BelongsToとHasMany先が関連しているモデルを一階層分とってくる。


    $result=$this->[頭大モデル名]->find([第一引数],[第二引数]);
        <第一引数>
            all        全レコード
            first        最初の1レコード
            list        レコードのリスト
            count        レコード数

        <第二引数>
            conditions      WHERE句で指定する条件。
                            フィールド名をキーに、検索条件値を値とする連想配列
            fields          取得するフィールド名
                            ※"fields"=>array("DISTINCT [カラム名1]","[カラム名2]"); 
                            (DISTINCTを追加すると[カラム名1]は重複しません)
            recursive       再帰的に取得する深度(0:全部  -1:単テーブル)
            order           取得順
            limit           取得するレコード数(limit)
            page            取得するページ数

        例)テーブル:products    フィールド:id,name,info

            $result=$this->Product->find("all",array("conditions"=>array(
                "Product.name"=>"りんご"),"order"=>array("Product.id"=>"desc")));
            [name]フィールドが"りんご"のレコードを全て選択し、[id]を降順で$resultへ格納する。

        //idが1か3を選択
        $result=$this->Product->find("all"
            ,array("conditions"=>array("or"=>array("Product.id"=>array(1,3)))));

        //idが1以上3未満
        $result=$this->Product->find("all"
            ,array("conditions"=>array("Product.id >="=>1,"Product.id <"=>3)));

        <findBy検索>
        $test=$this->Product->findByMailAndPass("[email protected]","1230");
            //ログインチェック用に便利。モデル Product の
             フィールド mail と pass が引数と一致するレコードを検索する。

        <NOT NULL 検索>
            array('conditions' => array('NOT' => array('[フィールド名]' => NULL)));

    //グループによるレコード数を集計するクエリ
    $list=$this->User->find("all",array("conditions"=>array()
        ,"fields"=>array("COUNT(User.info)","info"),"group"=>"info"));
        //ポイントは"fields"で、この引数にはカウントしたい
         フィールド名<"COUNT(モデル名.フィールド名)">1つだけと
        //表示したいフィールド名を設定する。
        //"group"にて集計したいグループを設定する。

    $list=$this->User->find("all",array("conditions"=>array()
        ,"fields"=>array("COUNT(User.name1)","info","name1"),"group"=>array("info","name1")));

    //複雑な集計です
    //groupをさらに配列にして複数のフィールドからなるグループを作成する事もできます


【ページング】

    [コントローラ側]
    $this->paginate = Array(
            'conditions' => array("カラム"=>"値","カラム"=>"値"),
            'limit' => 10,
            'order' => array(
                'id' => 'desc'
            )
        );

    $result = $this->paginate('テーブル名');


    [ビュー側]
        <?php
            foreach($result as $val){
                echo $val["テーブル名"]["カラム名"];
                echo "<br>";
            }
        ?>

    
<?php //adminルーティングしてる場合 $this->paginator->options(array('url' => array("admin" => true))); //情報表示 echo $this->paginator->counter(array('format' => "%start%件 ~ %end%件 (全 %count%件)")); echo $this->paginator->prev('<<',array( "url"=>array("controller"=>"campaigns","action"=>"comment_list"))); echo $this->paginator->numbers(array("modulus"=>2,"separator"=>"|")); echo $this->paginator->next('>>',array( "url"=>array("controller"=>"campaigns","action"=>"comment_list"))); ?>
※$this->paginator->numbers は、[前]と[次]の間を補完してくれるもの  引数 "modulus" => 2 とすると、複数ページがあっても『<< 1|2|3 >>』の様なリンクとなる (3個あるのは1つは該当ページなのでリンクが張ってないから)  引数 "separator" => "|" は、数字と数字の間の区切り文字を指定するもの 【メモ】 何かの理由で強引にページ数等を制御したい場合は 『$result = $this->paginate('テーブル名')』にパラメータを追加する事で可能です。 例) $shops = $this->paginate($conditions,array("page"=>1)) //上記の例は、強制的に1ページ目を表示する 以下はパラメータ一覧です $this->paginate=array( 'conditions' => array(検索条件), 'fields' => array(取得するカラム), 'page' => int(数値,最初に表示するページ。デフォルトは1,'last'(小文字)も可*1), 'limit' => int(数値:showでも可。デフォルトは20), 'sort' => string(ソートkey:order*2 でもよい。重なった場合はsortが優先される。), 'direction' => string(asc or desc:デフォルトはasc) 'recursive' => findAllに与える。 ); 【query 関数】 複雑なSQLは逆にフレームワークだと複雑になるので query 関数を使い直接 SQL文 を記述する。 $result = $this->Program->query($sql,array($param)); $result = $this->[大本になるテーブル名]->query([SQL文],array([パラメータ])); 例) $sql = "select * from users where username=? and del=?"; $param = array("versace",0); $result = $this->User->query($sql,$param);
ログインしてコメントを残そう!!


きっぷる
きっぷる