Project

General

Profile

Backport(バックポート) #3772

fileを参照するテーブル(activity_imageなど)のレコード削除時に対応するfileレコードが削除されない

Added by Chiharu Nakajima over 6 years ago. Updated over 6 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Target version:
Start date:
2015-01-05
Due date:
% Done:

100%


Description

Overview (現象)

メンバーのプロフィール画像やコミュニティ画像などの file テーブルを介して格納される画像について、ブラウザ上で画像を変更・削除しても対応する file, file_bin レコードがデータベース上に残ったまま削除されない。

削除されずに残った画像は管理画面のアップロード画像リスト (/pc_backend.php/monitoring) からも確認できる。

対象となるテーブル:

  • OpenPNE コア
  • opAlbumPlugin (#2447)
    • album
    • album_image
  • opCommunityTopicPlugin (#2591)
    • community_event_image
    • community_event_comment_image
    • community_topic_image
    • community_topic_comment_image
  • opDiaryPlugin (#106 修正済み)
    • diary_image
    • diary_comment_image
  • opMessagePlugin (#190)
    • message_file

Causes (原因)

HogeImage:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    hoge_id: { type: integer(4), notnull: true }
    file_id: { type: integer(4), notnull: true }
  relations:
    Hoge: { onDelete: cascade }
    File: { onDelete: cascade }

例えば上記の様な DB スキーマの定義があったとき、外部キー制約があるため file のレコードが削除されると対応する hoge_image のレコードが削除されるが、逆に hoge_image のレコードが削除されても file のレコードは削除されない。そのため hoge_image のレコードを削除する際に対応する file のレコードを明示的に削除する必要がある。

Way to fix (修正内容)

HogeImage を削除する際に関連する File が削除されるようにする

class HogeImage extends BaseHogeImage
{
  public function preDelete($event)
  {
    $this->File->delete();
  }
}

File を参照するモデルのクラスに preDelete() メソッドを定義し、その中で $this->File->delete(); を実行することで関連する file テーブルのレコードも削除されるようになる。

Hoge を削除する際に関連する HogeImage を明示的に削除する

hoge のレコードを削除した場合は、外部キー制約の ON DELETE CASCADE によりそれを参照する hoge_image のレコードも削除される。しかしこれは DBMS 側で行われるもので Doctrine は関知しないため、削除時に HogeImage::preDelete() は実行されない。
これでは Hoge の delete() メソッドを呼び出した場合には前述の修正に関わらず File から画像が削除されず残ってしまうため、Hoge::preDelete() から $this->HogeImage->delete(); を明示的に呼び出す必要がある。

class Hoge extends BaseHoge
{
  public function preDelete($event)
  {
    // HogeImage::preDelete() を実行させるために明示的に削除する
    $this->HogeImage->delete();
  }
}

Subtasks

Backport(バックポート) #3770: コミュニティ画像が設定されたコミュニティを削除しても画像がDBから削除されないFixed(完了)Youichi Kimura

Backport(バックポート) #3769: バナー設定でアップロードした画像を削除してもDBから削除されないFixed(完了)Youichi Kimura

Backport(バックポート) #3768: 画像付きのOAuthアプリケーションを削除してもDBから画像が削除されないFixed(完了)Youichi Kimura


Related issues

Related to OpenPNE 3 - Backport(バックポート) #3376: メンバーが退会しても、管理画面にメンバーのイメージ画像が残っている Fixed(完了) 2013-07-16
Copied from OpenPNE 3 - Bug(バグ) #3738: fileを参照するテーブル(activity_imageなど)のレコード削除時に対応するfileレコードが削除されない Won't fix(対応せず) 2013-07-16

Associated revisions

Revision 463d01c6
Added by Rimpei Ogawa over 6 years ago

Merge pull request #243 from C-nakajima/t-3772

(refs #3772, BP from #3738) Fixed a bug that when deleting records in the table that refers to the file is not deleted

History

#1 Updated by Chiharu Nakajima over 6 years ago

  • Copied from Bug(バグ) #3738: fileを参照するテーブル(activity_imageなど)のレコード削除時に対応するfileレコードが削除されない added

#2 Updated by Chiharu Nakajima over 6 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

プルリクエストしました。
https://github.com/openpne/OpenPNE3/pull/243

#3 Updated by Rimpei Ogawa over 6 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

#4 Updated by isao sano over 6 years ago

  • Status changed from Pending Testing(テスト待ち) to Pending Merge(マージ待ち)
  • % Done changed from 70 to 80

#5 Updated by isao sano over 6 years ago

ステータスを間違えて変更してしまいました。
元に戻します。

#6 Updated by Chiharu Nakajima over 6 years ago

  • Status changed from Pending Merge(マージ待ち) to Pending Testing(テスト待ち)
  • % Done changed from 80 to 70

#7 Updated by isao sano over 6 years ago

#8 Updated by isao sano over 6 years ago

#9 Updated by isao sano over 6 years ago

#10 Updated by isao sano over 6 years ago

  • Status changed from Pending Testing(テスト待ち) to Pending Merge(マージ待ち)
  • % Done changed from 70 to 80

#3770: コミュニティ画像が設定されたコミュニティを削除しても画像がDBから削除されない
#3769: バナー設定でアップロードした画像を削除してもDBから削除されない
#3768: 画像付きのOAuthアプリケーションを削除してもDBから画像が削除されない
#3376: メンバーが退会しても、管理画面にメンバーのイメージ画像が残っている

子チケットにあたる以上のチケットのテストが完了したため、本チケットもテスト完了と致します。

#11 Updated by Rimpei Ogawa over 6 years ago

  • Status changed from Pending Merge(マージ待ち) to Fixed(完了)
  • % Done changed from 80 to 100

Also available in: Atom PDF