SOY CMS / SOY Shop

ブログトップ

SOY App開発の説明 SOY2DAOでデータベースを利用する2

2014年02月04日

前回はSOY2DAOで使うファイルのオブジェクトの方を説明しました。

今回はDAOファイルの方の説明を記載したいと思います。

SOY App開発の説明 SOY2DAOでデータベースを利用する1




/CMSインストールディレクトリ/app/webapp/mock/src/domain/SOYMock_SampleDAO.class.php

で下記の様に抽象クラスを作成します。


<?php
/**
 * @entity sample.SOYMock_Sample
 */
abstract class SOYMock_SampleDAO extends SOY2DAO{

}
?>

作成したDAOのクラスはSOY2DAOクラスを継承して作成します。


class名の上に記載されている@entityには、

対応するオブジェクトのファイルをdomain以下からドット区切りで指定します。


DAOでデータベースをいじるための関数は抽象メソッドにします。


INSERT文を追加するには


/**
 * @return id
 * @trigger onInsert
 */
abstract function insert(SOYMock_Sample $bean);

とします。


この関数の呼び出し方は次回に詳しく記載しますが、

$dao->insert($obj);のように呼び出すと、

関数の処理中にINSERT文が生成され、

データベースに値が挿入されます。


関数の上にあるコメント内の@return idはinsert文が実行された後に返される値を指定し、

@triggerはinsertが実行される前に実行されるトリガーを指定できます。


今回は@trigger onInsertと記載されているので、


/**
 * @final
 */
function onInsert($query, $binds){
	$binds[":createDate"] = time();
	$binds[":updateDate"] = time();
		
	return array($query, $binds);
}

上記のようなfinalメソッドを用意します。




SELECT文の関数は


/**
 * @return list
 * @order id desc
 */
abstract function get();
	
/**
 * @return object
 */
abstract function getById($id);

このように用意します。


get()の場合は特に条件の指定なく全件取得で、

getById($id)では、関数名からWHERE id = :idのような条件文となります。


コメント内にある@returnはlistの場合はオブジェクトの配列で返し、

objectの場合は一つのオブジェクトを返します。


@orderはORDER BY句で、@order id descの場合は、

ORDER BY id descをSQL文を追加することになります。


WHERE句の条件を複数にしたい場合は、


/**
 * @return list
 * @query name = :name AND create_date > :createDate
 * @order id desc
 */
abstract function getByNameAndCreateDate($name, $createDate);

上記のように@queryでWHERE句に入れる条件を指定します。

引数に入れた値がプレースホルダ-として扱われます。

関数名はgetBy***とすれば、自由に付けても構いません。


DELETE文やCOUNT文も上記と同様に作成してください。




上記のような抽象メソッドではなく、

自身でPHPの処理やSQLの実行を組み合わせた複雑な処理を行いたいという場合には、


function getSamples($str){
		
	$dao = new SOY2DAO();
		
	$sql = "SELECT * FROM soymock_sample WHERE name LIKE %%:name%%";
	$binds = array(":name" => $str);
		
	try{
		$results = $dao->executeQuery($sql, $binds);
	}catch(Exception $e){
		$results = array();
	}
		
	return $results;
}

このような関数を用意すれば使えます。