LoginSignup
17
19

More than 5 years have passed since last update.

Doctrine 2 DBALを使ってみる(SQL直投げ編)

Last updated at Posted at 2013-06-29

1.DBALを使えるようにする

今回はComposerに依存管理をお願いしてDoctrineを準備してもらいます。
なので、まずはComposerを準備します。

Composer準備

curl -s http://getcomposer.org/installer | php

そしてcomposer.jsonというファイルを準備。

composer.json
{
    "require": {
        "doctrine/dbal": ">=2.3.0"
    }
}

後はComposerに任せるだけ。

php composer.phar install

コマンドの実行後にカレントディレクトリにはvendorというディレクトリが出来ています。
Composerがよしなにしてくれるので、Composerに追加してあるものであれば以下のファイルをインクルードするだけで済みます(便利!)

<?php
include_once "vendor/autoload.php";

次にDoctrineの初期化処理をしていきます。

Doctirne準備

<?php

use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;

// 接続するDBの設定
$conn = [
    "driver"=>"pdo_mysql",
    "host"=>"localhost",
    "user"=>"root",
    "password"=>"password",
    "dbname"=>"db_name",
    "charset"=>"utf8",
];

// デフォルトのフェッチ形式を連想配列にする
$config = new Configuration([ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]);

$doctrine = DriverManager::getConnection( $conn, $config );

これでDBALが利用できるようになりました。

2.SQLを投げてみる

一番シンプルなの

基本的には以下のようにするだけです。

$result = $doctrine->fetchAll( 'SELECT * FROM sample_table' );
var_dump( $result );

バインドを使ってみる

バインドとは何か?
とりあえずは下のソースを見てみましょう!

$result = $doctrine->fetchAll( 'SELECT * FROM sample_table WHERE id = :id', ['id'=>1] );
var_dump( $result );

SQL文中になにやら怪しげなのが!?
id = :id
:が付いているのがありますね。
実は:をつけたものは第二引数で指定している配列上のパラメータに置き換えをしてくれます(便利!!)
これが、バインドという機能です

INSERTしてみる

INSERT/UPDATE/DELETEをする際には、fetchAllではなくexecuteUpdateを使います。
また、返値は行数が帰ってきます。

<?php
$result = $doctrine->executeUpdate(
    'INSERT INTO sample_table ( id, description ) VALUES ( :id, :description',
    [ 'id'=>2, 'description'=>'INSERTしてみる!' ]
);
var_dump( $result );

書き方のバリエーション

<?php

    // ベースとなるSQLをprepareでセット
    $stmt = $doctrine->prepare( 'SELECT * FROM sample_table WHERE id = :id' );

    // ex. 複数のIDで抽出したいとか(WHERE INとかにするべきなんだろうけどとりあえず
    // WHERE IN にする方法があるという気もするけど・・・・
    $stmt->bindValue( ':id', 1 );
    $stmt->execute();
    var_dump( $stmt->fetchAll() );

    $stmt->bindValue( ':id', 2 );
    $stmt->execute();
    var_dump( $stmt->fetchAll() );

    // 単一行の抽出ならfetchAssoc()
    var_dump( $stmt->fetchAssoc() );

次回、もしかしたらQueryBuilder編が・・・・!

17
19
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19