例外

Nette Databaseは例外の階層を使用します。基本クラスは Nette\Database\DriverException で、これは PDOException を継承し、データベースエラーを処理するための拡張機能を提供します:

  • getDriverCode() メソッドは、データベースドライバからのエラーコードを返します
  • getSqlState() メソッドは、SQLSTATEコードを返します
  • getQueryString() および getParameters() メソッドは、元のクエリとそのパラメータを取得できます

DriverException から、次の特殊な例外が継承されます:

  • ConnectionException – データベースサーバーへの接続失敗を示します
  • ConstraintViolationException – データベース制約違反の基本クラスで、以下が継承されます:
    • ForeignKeyConstraintViolationException – 外部キー制約違反
    • NotNullConstraintViolationException – NOT NULL制約違反
    • UniqueConstraintViolationException – 値の一意性制約違反

UniqueConstraintViolationException 例外をキャッチする例。これは、データベースに既に存在するメールアドレスを持つユーザーを挿入しようとしたときに発生します(メールカラムに一意インデックスがあると仮定)。

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'このメールアドレスのユーザーは既に存在します。';

} catch (Nette\Database\DriverException $e) {
	echo '登録中にエラーが発生しました: ' . $e->getMessage();
}