$modx->db->select
任意のテーブルの情報を取得します。
select($fields = '*', $from = '', $where = '', $orderby = '', $limit = '')
- $fields・・・データを取得したいフィールドの名前。「 * 」を指定すると全てのフィールドの情報を取得します。
- $from・・・対象テーブルのテーブル名。「 [+prefix+] 」という文字列を使うとテーブルプレフィクスを自動的に付加します。
- $where・・・取得条件。たとえば$fromが [+prefix+]site_contentで$whereがparent=3の場合、IDが3のリソースのサブリソースの情報をまとめて取得します。
- $orderby・・・取得する順番
- $limit・・・取得件数
使用例
$modx->db->select('*', '[+prefix+]site_content');
サイト内の全てのリソース情報を取得します。
mysql_query('SELECT * FROM modx_site_content');
実際には上記のように置き換えられて実行されます。
$modx->db->select('id,pagetitle', '[+prefix+]site_content');
サイト内の全てのリソース情報を取得します。取得するフィールドはリソースIDとリソース名だけなので、大量のデータを一度に処理する場合はメモリを節約できます。
※select関数を実行した時点ではポインタを取得するだけなのでメモリ量はほとんど変わりません。処理スピードだけで見ると「 * 」を指定するのが最も高速ですが、処理対象の情報量が少ない場合はほぼ誤差の範囲内なので、可読性を高めるために「 id,pagetitle 」というふうに明示的に記述するのもよいでしょう。
$tbl_site_content = $modx->getFullTablleName('site_content');
$modx->db->select('*', $tbl_site_content);
1.0.7J以前のバージョンでは[+prefix+]プレースホルダを使えないため、上記のように記述します。
$modx->db->select('*', 'modx_site_content');
汎用性・拡張性を考慮する必要がないクローズドな案件では上記のようにそのまま書いても実用上の問題はありませんが、見た目としてはあまり変わらないため[+prefix+]を用いることをおすすめします。
$modx->db->select('pagetitle', '[+prefix+]site_content', 'id=3');
リソースIDが3のリソースのリソース名を取得します。
上記の書き方は厳密には問題があるため、下記のように書く習慣をつけることをおすすめします。
$modx->db->select('pagetitle', '[+prefix+]site_content', "`id`='3'");
MySQLの予約名と同じフィールド名が存在する可能性があるためバッククォート( ` )でフィールド名を囲み、SQLインジェクションが起きる可能性を抑えるために値をシングルクォート( ' )で囲みます。MODX Evolutionは現時点ではPDOに対応していないため、このような配慮が必要です。この例文のようなシンプルな処理なら問題はありませんが、複雑なコードを書く場合は注意しましょう。
$modx->db->select('COUNT(*)', '[+prefix+]site_content');
記事の件数を取得します。COUNT関数についてはMySQLのリファレンスを確認してください。
取得した情報はそのままでは利用できません。$modx->db->getRow()などの関数を用いて配列または文字列、取得件数などの情報に変換する必要があります。
以下は、取得した情報を実際に表示する方法です。
$rs = $modx->db->select('id,pagetitle', '[+prefix+]site_content', 'id=3');
$row = $modx->db->getRow($rs);
echo $row['id'] . '<br />';
echo $row['pagetitle'] . '<br />';
取得した情報を実際に出力します。
$rs = $modx->db->select('*', '[+prefix+]site_content', 'parent=3');
while($row = $modx->db->getRow($rs)) {
echo $row['id'] . '<br />';
echo $row['pagegitle'] . '<br />';
}
データが複数に及ぶ場合は上記のように処理するとよいでしょう。上記の例では、リソースIDが3のリソースのサブリソースの一覧を出力しています。
$rs = $modx->db->select('COUNT(*)', '[+prefix+]site_content', 'parent=3');
$count = $modx->db->getValue($rs);
echo $count;
サブリソース数を出力します。取得される値がひとつしかない場合はgetValue()が手軽で便利です。
$rs = $modx->db->select('*', '[+prefix+]site_content', 'parent=3');
$count = $modx->db->getRecordCount($rs);
echo $count;
このように記述することもできます。
$doc = $modx->getDocumentObject('id','3');
echo $doc['id'] . '<br />';
echo $doc['pagetitle'] . '<br />';
リソースの情報を取得するだけなら、DBAPIを用いず上記のようにパーサ関数を用いることもできます。目的が特化しているパーサ関数を用いるほうが便利なケースは多いです。
DBAPIはMySQLコマンドを直接実行する形に近いため、汎用性が高い・処理が軽いというメリットがあります。
パーサ関数も、処理の内部ではDBAPIを利用しています。
$modx->db->select('post_title', 'wp_posts', '5<comment_count');
上記のように記述すると、同じデータベースを利用しているWordPressに対して、5件以上のコメントがついている記事の情報を取得することができます。
DBAPIを用いると、処理がエラーになる場合はイベントログとして蓄積し、処理時間の計測も行えるため、MySQL関数を直接実行するよりも効率よく開発を行なうことができます。
function select($fields = '*', $from = '', $where = '', $orderby = '', $limit = '') {
if(!$from) return false;
else {
$from = $this->replaceFullTableName($from);
if($where !== '') $where = "WHERE {$where}";
if($orderby !== '') $orderby = "ORDER BY {$orderby}";
if($limit !== '') $limit = "LIMIT {$limit}";
return $this->query("SELECT {$fields} FROM {$from} {$where} {$orderby} {$limit}");
}
}