LoginSignup
19
24

More than 5 years have passed since last update.

Doctrine DBALの基本的な使い方

Last updated at Posted at 2015-02-11

公式ドキュメントを参考に基本的な使い方をまとめる。

接続

$conn = \Doctrine\DBAL\DriverManager::getConnection([
    'path'   => './dbal-demo.sqlite',
    'driver' => 'pdo_sqlite',
]);

各DBごとにパラメータが違う。詳しくはドキュメントを参照:
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connection-details

SQL実行

参考:
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html

直SQL

基本

$statement = $conn->executeQuery('SELECT * FROM users WHERE id = ?', [1]);
$user = $statement->fetch();
/*
[
    "id"   => "1",
    "name" => "bob"
]
*/

第三引数でパラメータの型を「配列」と指定してあげれば、IN句に配列を渡すことが出来る。
(他のメソッドでもだいたい最後の引数で指定できるみたい)

$conn->fetchAll(
    'select * from users WHERE id IN (?)',
    [[1, 2]],
    [\Doctrine\DBAL\Connection::PARAM_INT_ARRAY]
);

update

$count = $conn->executeUpdate('UPDATE users SET name = ? WHERE id = ?', ['smith', 1]);
echo $count; // 1

insert

$conn->insert('users', ['id' => 2, 'name' => 'mike']);

update

$conn->update('users', ['name' => 'smith'], ['id' => 1]);

delete

$conn->delete('users', ['id' => 1]);

select

複数

$conn->fetchAll('SELECT * FROM users');
/*
[
    [
        "id"   => "1",
        "name" => "bob"
    ],
    [
        "id"   => "2",
        "name" => "mike"
    ]
]
*/

一件

$user = $conn->fetchAssoc('SELECT * FROM users WHERE id = ?', [1]);
/*
[
    "id"   => "1",
    "name" => "bob"
]
*/

カラム指定

$name = $conn->fetchColumn('SELECT name FROM users WHERE id = ?', [1]);
echo $name; // "bob"

クエリログ

DB接続時にConfiguration経由でSQLLoggerのインスタンスを渡す。

$logger = new \Doctrine\DBAL\Logging\DebugStack();
$config = new \Doctrine\DBAL\Configuration();
$config->setSQLLogger($logger);
$conn = \Doctrine\DBAL\DriverManager::getConnection([
    'path'   => './dbal-demo.sqlite',
    'driver' => 'pdo_sqlite',
], $config);

もしくはあとから設定。

$logger = new \Doctrine\DBAL\Logging\DebugStack();
$conn->getConfiguration()->setSQLLogger($logger);

クエリを実行したあと、queriesプロパティにログがたまっている。

$conn->fetchAll(
    'select * from users WHERE id IN (?)',
    [[1, 2]],
    [\Doctrine\DBAL\Connection::PARAM_INT_ARRAY]
);

$conn->getConfiguration()->getSQLLogger()->queries;
/*
[
  1 => [
    "sql"         => "select * from users WHERE id IN (?)",
    "params"      => [
      [
        1,
        2
      ]
    ],
    "types"       => [
      101
    ],
    "executionMS" => 0.0022280216217041
  ]
]
*/

まとめ

  • "便利なPDO"として使えそう
  • ややこしい機能は省略した
    • 型のバインディング
    • スキーマ管理
    • シャーディング
    • など
19
24
0

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
19
24