今回は、基本的な処理として『取得』『追加』『更新』『削除』のクエリの作成と、
実際にデータベースへアクセスする為のアダプタの作成方法を
ソースコード付きで解説します。
- ZendFramework2(ZF2)流のデータベース接続用アダプタを作成しよう
- ZendFramework2(ZF2)流の簡単なクエリの作成と実行
- ZendFramework2(ZF2)流のセレクト文を使用してみよう
- ZendFramework2(ZF2)流のインサート文を使用してみよう
- ZendFramework2(ZF2)流にレコードを更新してみよう
- ZendFramework2(ZF2)流にレコードを削除しよう
ZendFramework2(ZF2)流のデータベース接続用アダプタを作成しよう
データベースを操作する為のアダプターを作成します。
これからはアダプターを介してクエリを発行していきます。
まずはアダプターの作成方法です。
$adapter = new Zend\Db\Adapter\Adapter($configArray);
データベース用のアダプタークラスをnewします。
その際に、データベースへアクセスする為の情報を連想配列として引数で渡してあげます。
連想配列で設定する項目のkeyとvalueは下記の通りです。
driver | Mysqli, Sqlsrv, Pdo_Sqlite, Pdo_Mysql, Pdo=その他のPDOドライバー |
---|---|
database | データベース名 |
username | ユーザー名 |
password | パスワード |
hostname | ホスト名 |
port | ポート |
charset | 文字コード |
MySQLの場合は下記の様な作成になるかと思います。
$adapter = new Zend\Db\Adapter\Adapter(array( 'driver' => 'Pdo_Mysql', 'database' => 'zend_db_example', 'username' => 'developer', 'password' => 'developer-password' ));
ZendFramework2(ZF2)流の簡単なクエリの作成と実行
これでデータベース接続用のアダプターが出来ました。
後はこのアダプターを返してクエリを発行します。
クエリを発行するのは
$result = $adapter->query('SELECT * FROM `artist` WHERE `id` = ?', array(5));
のように、作成したアダプターのquery()メソッドを使用します。
第一引数にクエリを下記、第二引数で配列としてクエリの中に入れる値を定義します。
第一引数内に記述した『?』に第二引数の値が順に当てはめられるイメージですね。
また、SQL文を生成してくれるクラスも存在します。
WEBアプリケーションで基本となる『取得』『追加』『更新』『削除』が
とても手軽に出来るのでお勧めです。
それぞれのSQLオブジェクトの作成方法は下記を参考にして下さい。
use Zend\Db\Sql\Sql; $sql = new Sql($adapter); $select = $sql->select(); // @return Zend\Db\Sql\Select $insert = $sql->insert(); // @return Zend\Db\Sql\Insert $update = $sql->update(); // @return Zend\Db\Sql\Update $delete = $sql->delete(); // @return Zend\Db\Sql\Delete
それぞれのSQLオブジェクトが取得出来ます。
後はそのオブジェクトに対して様々な条件を追加していきます。
ZendFramework2(ZF2)流のセレクト文を使用してみよう
まずは『取得』に当たる『select』を例にとって見てみましょう
use Zend\Db\Sql\Sql; // SQLのインスタンスを生成 $sql = new Sql($adapter); // セレクト用クエリの取得 $select = $sql->select(); // 対象テーブルを設定 $select->from('foo'); // 対象カラムを指定 $select->columns(array('foo', 'bar')); // where 条件を設定 $select->where(array('id' => 2)); // 昇降順を指定 $select->order('id ASC'); // リミットを設定 $select->limit(5); // オフセットを設定 $select->offset(10); // 作成したクエリを使用してステートメントを作成する $statement = $sql->prepareStatementForSqlObject($select); // ステートメントを実行して結果セットを取得する $results = $statement->execute();
カラム指定時のas文は下記の用に記述します。
$select->columns(array('foo' => 'bar', 'baz' => 'bax'));
join句は下記の様にfromに続けて指定します
$select->from(array('f' => 'foo')) // base table ->join(array('b' => 'bar'), // join table with alias 'f.foo_id = b.foo_id'); // join expression
ZendFramework2(ZF2)流のインサート文を使用してみよう
続きまして、テーブルにレコードを追加する『insert』を使用して見ましょう。
use Zend\Db\Sql\Sql; // SQLのインスタンスを生成 $sql = new Sql($adapter); // 追加用クエリの取得 $insert = $sql->insert(); // 追加先テーブルを指定します。 $insert->into('table'); // カラムを指定します $insert->columns(array('foo', 'bar')); // 追加する値を設定します $insert->values(array( 'foo' => 'value1', 'bar' => 'value2' )); // 作成したクエリを使用してステートメントを作成する $statement = $sql->prepareStatementForSqlObject($insert); // ステートメントを実行して結果を取得する $results = $statement->execute();
ZendFramework2(ZF2)流にレコードを更新してみよう
続いてはレコードの『更新』用クエリの使い方です。
use Zend\Db\Sql\Sql; // SQLのインスタンスを生成 $sql = new Sql($adapter); // 更新用クエリの取得 $update = $sql->update(); // 対象テーブルを指定 $update->table('table'); // 更新する値をセットする $update->set(array('foo' => 'bar', 'baz' => 'bax')); // 更新先レコードの条件を指定する $update->where(array('id' => 2)); // 作成したクエリを使用してステートメントを作成する $statement = $sql->prepareStatementForSqlObject($update); // ステートメントを実行して結果を取得する $results = $statement->execute();
ZendFramework2(ZF2)流にレコードを削除しよう
続いては削除です。これは論理削除ではなく、レコード事態を削除する完全削除ですので、
使用する際には気をつけましょう。
use Zend\Db\Sql\Sql; // SQLのインスタンスを生成 $sql = new Sql($adapter); // 削除用クエリの取得 $delete = $sql->delete(); // 対象テーブルを指定する $delete->from('table'); // 削除対象の条件を指定する $delete->where(array('id' => 2));
これで基本的なデータベースを扱ったサイトの構築が可能です。
上記の四つのクエリパターンはとても良く使うので、
しっかりと身に付けてしまいましょう。
濱田様
返信削除こちらの記事のselectのところですが
ステートメントを実行した結果が ["rowCount":protected]=> NULLで帰ってきてしまいます。
["queryString"]を直接DBに流すと結果が帰ってきます。
何か見落としているのでしょうか?
お忙しいとは思いますがご教授いただければと存じます。
黒沢大介様
削除いつも当ブログをお読み頂き、誠にありがとうございます。
>["queryString"]を直接DBに流すと結果が帰ってきます。
クエリが間違っていない事を考えると、次に考えられる事がDBとの接続です。
上手くDBと接続出来ていない可能性がありますので、
アダプター作成時の値を再度お確かめ頂ければ幸いです。
濱田様
削除ご返信ありがとう御座います。
アダプター作成時の値は間違えがありませんでした。
他、考えられる原因はあるでしょうか?
黒沢大介様
削除この度はご連絡遅くなり申し訳御座いません。
あれから色々と可能性を探りましたが、具体的な解決案を示す事が出来ません。
もし、今後解決致しましたら、原因と解決策をコメント頂ければ、
同じ様な悩みの方の為にもなりますし、是非ともご協力頂ければ幸いです。
何卒、宜しくお願い致します。
黒沢大介様
削除お世話になっております。少し時間が経ってしまいましたが、
少し気になる所が御座いましたので、コメントに残させて頂きます。
>こちらの記事のselectのところですが
>ステートメントを実行した結果が ["rowCount":protected]=> NULLで帰ってきてしまいます。
selectを実行した時に、『rowCount』がNULLとの事ですが、PDO的に言いますと
『rowCount』は取得した行数を表すのではなく、追加や削除、編集といったデータベース内のデータに対して、何かしらの修正をした行数を表します。
ですので、データの操作は行わず、取得するだけのselectでは基本的にNULLとなります。
例外として、取得した行数を返却するデータベースもある様ですが、保障はされていません。
詳しくはPHPのリファレンスを参照下さい。
http://php.net/manual/ja/pdostatement.rowcount.php
rowCountはNULLでも、値は取得出来ているかと思いますので、
foreach等で回して内容を確認してみて下さい。
解決方法の提示に時間が掛かってしまい、
申し訳御座いませんが何卒宜しくお願い致します。