SOY2DAOでデータベースから値を取り出すでSOY2DAOでDAOで値を取得する方法と結果がオブジェクトで返ってくることを記載しました。


それを踏まえた上で、

データベースから値を取得してそのデータを使いたい場合は、

DAOの様にメソッドが用意されていることなんてほとんどなく、

複雑なSQL構文を実行することが大半です。


そうなると、DAOというのは便利な様で案外不便で、

DAOという仕組みがうざったいと感じる時が多いです。


だけど、

複雑なSQLを実行しても、データそのものが扱いやすいオブジェクトで返したい

ということもたくさんあります。


ということで、

SQLを書きたいときは書くけど、結果はオブジェクトで返す

という方法をこれから説明します。




複雑なSQLを書きたい時というのは、なんといってもテーブルの結合でしょ。

SOY Shopの顧客データでいえば顧客テーブル(soyshop_user)とユーザカスタムフィールド(soyshop_user_attribute)の結合で、


たとえば、


user_custom_field_001


ユーザカスタムフィールドで項目ID(user_field_id)をsearch、種別をチェックボックスにし、

高度な設定で「a」という項目を用意しておく。


user_custom_field_002


どの顧客でも良いので、詳細画面で検索対象のaをチェックしておく。


この時点でユーザカスタムフィールドの値を確認してみると、


+---------+-----------------+--------------+
| user_id | user_field_id | user_value |
+---------+-----------------+--------------+
|           2 | search            | a                 |
+---------+-----------------+--------------+

こんな感じ。


以上を踏まえ、

ユーザカスタムフィールドで検索対象がaの顧客情報をオブジェクトで取得する処理を書いてみます。


まずはSQL構文だけど、


$sql = "SELECT user.* FROM soyshop_user user " .
"INNER JOIN soyshop_user_attribute atr " .
"ON user.id = atr.user_id ".
"WHERE atr.user_field_id = 'search' ".
"AND atr.user_value = 'a'";

INNER JOINでユーザカスタムフィールドのテーブルとつなげておき、ユーザカスタムフィールドの値で検索を行う。


それでは、

実際にこのSQLを実行するスクリプトだけど、


$userDao = SOY2DAOFactory::create("user.SOYShop_UserDAO");
try{
$results = $userDao->executeQuery($sql);
}catch(Exception $e){
$results = array();
}

こんな感じ。

一行目にSOY2DAOクラスを継承しているSOYShop_UserDAOを呼び出しているのがポイント。


今回はSQLを直接実行しているので、結果は配列だけど、


$users = array();
foreach($results as $res){
$users[] = $userDao->getObject($res);
}

結果の配列に対して、SOYShop_UserDAOのgetObjectメソッドをかましてみると、

返ってくる結果は、


array(3) {
[1]=>
object(SOYShop_User)#370 (41) {
["id":"SOYShop_User":private]=>
string(1) "1"
["mailAddress":"SOYShop_User":private]=>
string(20) "info@example.com"
["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) {
/** 同じような値 **/
}
}

こうなる。


今回の様にユーザカスタムフィールドの値で検索するけど、

結果を表示する時はユーザカスタムフィールドの値は出力しないというケースにおいて、

結果をオブジェクトに変換しておくと余計な値が削られるので大変便利です。


実はこの方法は、

以前紹介したSOY CMSに検索フォームを追加するところでも利用している。

検索フォームと検索結果ページを作ってみた3