DB::delete() does not support comparison operators other than `=` and does so without warning
DB::delete() uses wpdb::delete() under the hood, which only supports the = comparison operator.
This can cause some seriously unexpected results, because the SQL is silently converted and doesn't warn the developer that they aren't executing their expected query.
Ideally, we would no longer use wpdb::delete() under the hood and instead build our own DELETE SQL. Temporary solutions could be some doc updates and finding a way to throw an exception if a developer tries to do this.
Delete query with comparison operator other than =:
DB::table( 'posts' )->where( 'ID', 100, '>' )->delete();
The expected SQL for the above query:
DELETE FROM wp_posts
WHERE `ID` > 100
The actual SQL for the above query:
DELETE FROM wp_posts
WHERE `ID` = 100
The same happens when trying to use whereIn.
Oof, yeah, we should deviate. My recommendation for the future:
-
DB::delete()usesWPDB::delete()with error catching -
DB::table()->delete()runs a custom query