libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

データ検索をマスターする! (5/6)

作成:2015-10-03 09:14
更新:2015-10-03 09:14

■クエリーを直接実行するには?

フレームワークのデータベース利用は、基本的に「いかにしてSQLのクエリーを排除するか」を考えて設計されているといっていいでしょう。SQLはデータベースによって方言があったり、また設計変更でクエリーを修正するのにバグが混じりやすかったりします。こうしたデータベース固有の部分を排除することがフレームワークの命題だったともいえます。

が! それはそれとして、「やっぱりSQLクエリーを直接実行できたほうが便利」というシーンもあるかもしれません。そんなときはどうすればいいのでしょう?

これは、「Connection」というクラスを利用します。では、利用の流れについて簡単にまとめておきましょう。

●Connectionを用意する
$変数  = ConnectionManager::get('default');
Connectionインスタンスを用意するにはいくつかの方法がありますが、基本は「ConnectionManager」というクラスの「get」メソッドを使う方法でしょう。引数には、取り出すデータベース設定名を指定します。データベースの設定は、app.php内に'Datasources'という値として用意されていました。通常は、ここにある'default'の設定が使われますので、get('default')としておきます。

ということは、app.phpにいくつかの設定を用意しておけば、getで取り出す設定名を変えることで複数のデータベースにアクセスできる、ということでもあります。

●《StatementInterfaceを得る
$変数 = 《Connection》->query( クエリー文 );
queryメソッドは、引数にクエリーのテキストを指定し、StatementInterfaceのインスタンスを返します。これにより、クエリーを実行するステートメントのオブジェクトが用意されます。

●フェッチする
$変数 = 《StatementInterface》->fetch();
$変数 = 《StatementInterface》->fetchAll();
ステートメントから、実際にデータを取り出します。fetchは呼び出す度に1つずつエンティティを取り出していきます。fetchAllは、すべてのエンティティをまとめて取り出します。


では、実際にやってみましょう。まずは、テンプレートとなるfind.ctpを修正しておきましょう。クエリーを直接実行する場合、モデルを介しませんから、得られるレコードは連想配列の形になって渡されます。ですから、連想配列の中からフィールドの値を取り出すような形に書き換えておく必要があります。こんな感じですね。

●モデル利用の場合
<td><?= h($person->id) ?></td>
<td><?= h($person->name) ?></td>
<td><?= h($person->age) ?></td>
<td><?= h($person->mail) ?></td>

●連想配列の場合
<td><?= h($person['id']) ?></td>
<td><?= h($person['name']) ?></td>
<td><?= h($person['age']) ?></td>
<td><?= h($person['mail']) ?></td>
では、テンプレートが用意できたところで、次にプログラムの作成を行いましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

<div>
    <h3>Find Person</h3>
    <?= $msg ?>
    <?= $this->Form->create() ?>
    <fieldset>
        <?= $this->Form->input('find'); ?>
    <?= $this->Form->button('Submit') ?>
    <?= $this->Form->end() ?>
    </fieldset>
    <table>
    <thead>
        <tr>
            <th>ID</th>
            <th>NAME</th>
            <th>AGE</th>
            <th>MAIL</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($persons as $person): ?>
        <tr>
            <td><?= h($person['id']) ?></td>
            <td><?= h($person['name']) ?></td>
            <td><?= h($person['age']) ?></td>
            <td><?= h($person['mail']) ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
    </table>
</div>
※関連コンテンツ

「初心者のためのCakePHP3 プログラミング入門」に戻る