web-dev-qa-db-ja.com

LIKEとINの両方を使用してdb_deleteを支援します。ワイルドカードを使用しながら、多くの行を削除しようとしています

ブロック用のカスタムキャッシュ消去モジュールを書いています。

現時点では、1人のユーザーとその複数の言語のキャッシュを削除できます。

$uid = 7094;
$module = 'custom_home_panes';
$block = 'custom_home_panes_news_group';
$theme = 'framework';
$table = 'cache_block';

$cid_start = $module . ':' . $block . ':' . $theme . ':';
// Wildcard in middle for language code
$cid_end = ':u.' . $uid;

$delete = db_delete('cache_block')
  ->condition('cid', db_like($cid_start) . '%%' . db_like($cid_end), 'LIKE')
  ->execute();

しかし、私はUIDの配列に対してこれを行う必要があり、以下のスニペットのようにINを使用する必要があると思います。

->condition('uid', array(1,5,7),'IN')

私は自分がしたことを配列に追加できると思ったので、ここまでたどり着いたのです。

foreach ($uids as $uid) {
    $queries[] = db_like($module . ':' . $block . ':' . $theme . ':') . '%%' . db_like(':u.' . $uid), 'LIKE';
}

最終結果は、以下のようなレコードを削除するクエリになります。

custom_home_panes:custom_home_panes_news_group:framework:vi:u.7250
custom_home_panes:custom_home_panes_news_group:framework:en:u.7250
custom_home_panes:custom_home_panes_news_group:framework:vi:u.7253
custom_home_panes:custom_home_panes_news_group:framework:en:u.7253

SQLのスキルはひどいです。ありがとう!

3
Niall Murphy

LIKEとINを組み合わせて使用​​することはできません。

UIDごとに異なるクエリを実行する必要があります。

例えば。

$cid_base_pattern = db_like($module) . ':' . db_like($block) . ':' . db_like($theme) . ':%:u.';

foreach ($uids as $uid) {
    db_delete('cache_block')
      ->condition('cid', $cid_base_pattern . $uid, 'LIKE')
      ->execute();
}
2
Felix Eve