前回のSOY CMSを介さずにSOY2DAOを使ってみる1では、

SOY2DAOクラスを読み込んでみたけれども、

SOY2DAOを介してDAOではなく自作したSQL構文を実行してみた。


今回はDAOを実行するサンプルコードを作成してみる。

SOY2DAOでデータベースから値を取り出す


はじめにDAOを実行するためのクラスを用意する。

DAO用のクラスは下記の個所に作成してみる。


.
├── index.php
└── webapp
    ├── cache
    ├── lib
    │   └── soy2_build.php
    └── src
        └── domain
            ├── SOY2Sample.class.php
            └── SOY2SampleDAO.class.php

※SOY2HTMLで作成したcacheディレクトリは今回も使用する予定


domainディレクトリ以下に作成した2つのファイルがDAOファイル用で、

***.class.phpと***DAO.class.phpと***の個所を合わせて作成すると使いやすい。


各々のコードを見てみると、

SOY2Sample.class.php

<?php

/**
 * @table soy2_sample
 * 当クラスと対応したテーブル名を表記
 */
class SOY2Sample {

	/**
	 * @id
	 * primary keyに対応するプロパティであることをSOY2に知らせる
	 */
	private $id;
	private $text;

	/**
	 * @column create_date
	 * データベースで定義したカラム名とプロパティが異なる場合は上記の@columnを追加
	 */
	private $createDate;

	function getId(){
		return $this->id;
	}
	function setId($id){
		$this->id = $id;
	}

	function getText(){
		return $this->text;
	}
	function setText($text){
		$this->text = $text;
	}

	function getCreateDate(){
		return $this->createDate;
	}
	function setCreateDate($createDate){
		$this->createDate = $createDate;
	}
}

テーブルの設計に合わせたプロパティと各々のカラム(プロパティ)に対応したゲッター、セッターを用意します。

所々にコメントで記載されている個所は超大事!

コメント内の表記はReflectionクラスで解釈しています。

PHP: Reflection - Manual


続いて対になるDAOファイルはというと、

SOY2SampleDAO.class.php

<?php
/**
 * @entity SOY2Sample
 * 対になるクラスファイルをSOY2に知らせる
 */
abstract class SOY2SampleDAO extends SOY2DAO {

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

	/**
	 * @return list
	 */
	abstract function get();

	/**
	 * @return object
	 */
	abstract function getById($id);

	/**
	 * @final
	 * @triggerで当メソッドを指定している抽象メソッド実行時に補完するメソッド
	 */
	function onInsert($query, $binds){
		$binds[":createDate"] = time();

		return array($query, $binds);
	}
}

抽象クラスで各々のDAOのメソッドを用意する。

詳しくは説明しないが、ここでもコメントの書き方が超大事です。


ここまで準備出来たら、

あとはindex.phpを下記のように書き換えて実行してみる。


<?php
define("WEBAPP_DIR", dirname(__FILE__) . "/webapp/");

//include SOY2
if(!class_exists("SOY2")) include_once(WEBAPP_DIR . "lib/soy2_build.php");

//configure SOY2
SOY2::RootDir(WEBAPP_DIR . "src/");

//SOY2DAOの設定 下記のコードは3つセットで実行
SOY2DAOConfig::DaoDir(SOY2::RootDir() . "domain/");
SOY2DAOConfig::EntityDir(SOY2DAOConfig::DaoDir());
SOY2DAOConfig::DaoCacheDir(WEBAPP_DIR . "cache/");

//作成したDAOファイルを読み込む
$dao = SOY2DAOFactory::create("SOY2SampleDAO");

//データベースの指定
SOY2DAOConfig::Dsn("sqlite::memory:");

//データベースのテーブルは直接作成
$table = "CREATE TABLE soy2_sample (id integer primary key AUTOINCREMENT, text TEXT, create_date INTEGER);";
try{
	$dao->executeQuery($table);
}catch(Exception $e){
	//
}

//レコードを追加
$obj = new SOY2Sample();
$obj->setText("hoge");

try{
	$id = $dao->insert($obj);
	echo "soy2_sampleにID" . $id . "のデータを挿入しました。";
}catch(Exception $e){
	echo "データの挿入を失敗しました";
}

//データを全件取り出す
try{
	$array = $dao->get();
}catch(Exception $e){
	$array = array();
}

echo "\n取得したデータは下記の通り\n";
var_dump($array);

実行結果は、

soy2_sampleにID1のデータを挿入しました。
取得したデータは下記の通り
array(1) {
  [0]=>
  object(SOY2Sample)#17 (3) {
    ["id":"SOY2Sample":private]=>
    string(1) "1"
    ["text":"SOY2Sample":private]=>
    string(4) "hoge"
    ["createDate":"SOY2Sample":private]=>
    string(10) "1530308792"
  }
}

こうなった。


関連記事

SOY2DAOでSQLを実行して、オブジェクトで返す