データベース関係クラスの使用(2) SQL Select編
SQLクラス
SQLクラスは、a-blog cmsで使用しているSQL文の作成を支援するクラスです。DBクラスとあわせて使用します。今回はSelect文を発行するケースで順にサンプルを紹介します。
基本のSELECTからテンプレートへの追加まで
// Templateクラス
$Tpl = new Template($this->tpl, new ACMS_Corrector());
// DBクラス @dsn()はconfig.server.php で定義されたデータベース情報を返します
$DB = DB::singleton(dsn());
// SQLクラス
$SQL = SQL::newSelect('entry');
// 対象の列を設定
$SQL->addSelect('entry_title');
$SQL->addSelect('entry_datetime');
// SQLを組み立てる
$q = $SQL->get(dsn());
// クエリーを実行して結果を取得
$all = $DB->query($q, 'all');
// 取得したデータをentry:loopとしてテンプレートに追加
foreach ( $all as $row ) {
$Tpl->add('entry:loop', $row);
}
return $Tpl->get();日付が新しい順に並び替えて10件取得する
$SQL = SQL::newSelect('entry');
$SQL->addSelect('entry_title');
$SQL->addSelect('entry_datetime');
// エントリーの日付で降順に並び替える
$SQL->setOrder('entry_datetime', 'DESC');
// 取得数を10までに制限する
$SQL->setLimit(10);
$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');
?>カテゴリーごとにエントリーの数をカウントする
$SQL = SQL::newSelect('entry');
// 合計をカウントする ( MAX・MINなど集計関数 )
$SQL->addSelect('*', 'amount', null, 'COUNT');
// カテゴリーIDでグループする
$SQL->setGroup('entry_category_id');
$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');WHEREの処理
entry_blog_idが1のエントリー
$SQL = SQL::newSelect('entry');
$SQL->setSelect('*');
// 第三引数以降は省略できます
$SQL->addWhereOpr('entry_blog_id', 1, '=', 'AND');
$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');entry_category_idが1 または entry_user_idが1のエントリー
$SQL = SQL::newSelect('entry');
$SQL->setSelect('*');
// entory_category_idが1
$SQL->addWhereOpr('entry_category_id', 1);
// または entry_user_idが1
$SQL->addWhereOpr('entry_user_id', 1, '=', 'OR');
$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');entry_statusがdraft(下書き) か close(非公開)であるエントリー
$SQL = SQL::newSelect('entry');
$SQL->setSelect('*');
// draft か close である ( IN )
$SQL->addWhereIn('entry_status_id', array('draft', 'close'));
$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');title, body, nameのいずれかに指定した文字列を含むコメント
$keyword = 'hogehoge';
$SQL = SQL::newSelect('comment');
$SQL->addSelect('*');
$SQL->addWhereOpr('CONCAT(comment_title, comment_body, comment_name)', "%$keyword%", 'LIKE');
$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');
校正オプションの拡張について
Acms\Custom\Correctorクラス(extension/acms/Corrector.php)にメソッドを定義することで、校正オプションの拡張が可能です。Acms\Custom\Correctorクラスが記述される、extension/acms/Corrector.phpは、アップデート時の上書き対象ではないので、自由に拡張してご利用いただけます。
テンプレート上の校正オプション指定との対応
<!-- {var}の中は、'a-blog cms' とする -->
<body>
{var}[sample('hoge', 'fuga')]
</body>テンプレート上に記述する校正オプション名と、Acms\Custom\Corrector 内で拡張するメソッド名を同一にします。テンプレート上から指定するメソッドへの引数は、シングルクオーテーションで囲い、カンマで区切ります。
<?php
namespace Acms\Custom;
/**
* 校正オプションにユーザー定義のメソッドを追加します。
* ユーザー定義のメソッドが優先されます。
*/
class Corrector
{
/**
* sample
* 校正オプションのサンプルメソッド
*
* @param string $txt - 校正オプションが適用されている文字列
* @param array $args - 校正オプションの引数 {var}[sample('ここの値')]
* @return string - 校正後の文字列
*/
public function sample($txt, $args = array())
{
// 例 {var}[sample('hoge','fuga')]
// {var}の中は,'a-blogcms' とする
$hoge = isset($args[0]) ? $args[0] : null; // 'hoge'
$fuga = isset($args[1]) ? $args[1] : null; // 'fuga'
return $hoge.$fuga.'+'.$txt; // 'hogefuga+a-blog cms'
}
}校正オプションのメソッドには、校正オプション適用対象の変数(主に文字列)と、テンプレート上で指定された引数が渡されます。
<body> hogefuga+a-blogcms </body>
例では、本来の変数 'a-blog cms' と、引数として与えられた文字列 'hoge' , 'fuga' が合成されて、'hogefuga+a-blogcms' という文字列が出力されます。
備考
校正オプションは、各GETモジュール内でテンプレート内の変数を解決する際に、付随する形で実行されます。そのためモジュールが出力してない変数に校正オプションを指定しても実行されません。