cakephp2.doc_032
最終投稿日:2019年11月20日
【テーブルへの登録】
//トランザクションを設定する場合
$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);