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=1
をstatement
で実行するようにします。
$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漏れに気づくことが容易になります。