4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelでQueryBuilder利用時にsql_safe_updatesを有効にする

Posted at

Eloquent利用時は対象のモデルをUPDATE,DELETEしますが、QueryBuilderを利用する際は対象のレコードはWHEREを適切に利用しなければ関係のないレコードも対象になってしまう可能性があります。

基本的には実装時、あるいはレビュー時点で気づくことと思いますが、MySQLのsql_safe_updatesという機能を利用することで実装漏れをしてもレコードを守ることが出来ます。

sql_safe_updatesとは

mysqlへのクエリ実行の際にこのフラグを有効にすることでUPDATE,DELETE時にWHEREもしくはLIMITまたその両方が指定されていない場合はクエリ実行ができなくなります。

mysql>SET sql_safe_updates=1

これをQueryBuilder利用時にも有効にすることで事故を減らそうという試みです。

QueryBuilder利用時にsql_safe_updatesを有効にする

Illuminate\Database\DatabaseManagerからconnectionを取得し、SET sql_safe_updates=1statementで実行するようにします。

$connection =  $this->databaseManager->connection();
if ($this->databaseManager->getDriverName() === 'mysql') {
    $connection->statement('SET sql_safe_updates=1');
}
return $connection->table($this->tableName);

このconnectionを利用していれば意図しないUPDATEやDELETEを防ぐことができます。
また、実装時も例外になって処理が失敗してしまうのでWHERE漏れに気づくことが容易になります。

4
0
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?