SOY2DAOでプリペアードステートメントを利用するでSOY2DAOでプリペアードステートメントをかましたSQLを実行する方法を記載しました。

SOY2DAO、その名の通り、DAOなので、SQL構文を書かなくてもデータベースから値を取り出すことができる。


例えば、

SOY Shopの顧客情報をデータベースから取り出す場合、


$userDao = SOY2DAOFactory::create("user.SOYShop_UserDAO");
$userDao->setLimit(5);  //データを5件取得する
try {
	$users = $userDao->get();
} catch(Exception $e) {
	$users = array();
}

これで5件取得できる。


結果は

array(5) {
  [1]=>
  object(SOYShop_User)#370 (41) {
    ["id":"SOYShop_User":private]=>
    string(1) "1"
    ["mailAddress":"SOYShop_User":private]=>
    string(20) "[email protected]"
    ["password":"SOYShop_User":private]=>
    string(168) "sha512/ハッシュ化された値"
    ["attribute1":"SOYShop_User":private]=>
    string(0) ""
    ["attribute2":"SOYShop_User":private]=>
    string(0) ""
    ["attribute3":"SOYShop_User":private]=>
    string(0) ""
    ["name":"SOYShop_User":private]=>
    string(9) "齋藤毅"
    /** 途中省略 **/
  }
  [2]=>
  object(SOYShop_User)#371 (41) {
    /** 同じような値 **/
  }
}

こんな感じ。


前回までのSQLを直接実行した際の結果と比較して、

前回までは配列で返ってきたけど、今回はSOYShop_Userというオブジェクトで返ってきている。


このオブジェクトは、SOY2DAOFactory::create()で指定したuser.SOYShop_UserDAOと対になっているSOYShop_Userを参照していて、

このオブジェクトを定義しているファイルは、

/cmsのインストールディレクトリ/soyshop/webapp/src/domain/user/SOYShop_User.class.php

にある。


オブジェクトにしているといろいろと便利で、

顧客情報から名前のデータを取り出したい場合、


配列から直接の場合、


$sql = "SELECT * FROM soyshop_user WHERE is_disabled != 1 ORDER BY register_date DESC LIMIT 5;"

//すでにDSN関連の情報は設定されている
$dao = new SOY2DAO();
try {
	$users = $dao->executeQuery($sql);
} catch(Exception $e) {
	$users = array();
}


foreach($users as $user){
	echo (isset($user["name"])) ? $user["name"] : "";
}

この様に値を出力する際、配列の中にnameの値があるか調べてから出力するけど、

DAOでオブジェクトとして値を取得した場合、


$userDao = SOY2DAOFactory::create("user.SOYShop_UserDAO");
$userDao->setLimit(5);  //データを5件取得する
try {
	$users = $userDao->get();
} catch(Exception $e) {
	$users = array();
}
foreach($users as $user){
	echo $user->getName();
}

値を取得するゲッタ関数が定義されているので、わざわざ配列のキーがあるかとか、オブジェクトのプロパティがあるかを調べる必要がないので、

注意深くせずとも簡単に値を取り出すことができる。


そうなると、

SQLで実行した時も結果をオブジェクトで扱いたいという時もあるかと思いますし、実際に多いです。


次回はその内容を記載しようかと思います。