プロジェクト

全般

プロフィール

Bug(バグ) #3738

Youichi Kimura9年以上前に更新

h3. Overview (現象)

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

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

対象となるテーブル:

* OpenPNE コア
** activity_image
** banner_image
** community
** member_image (#3375)
** oauth_consumer
* 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

h3. Causes (原因)

<pre><code class="yaml">
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 }
</code></pre>

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

h3. Way to fix (修正内容)

<pre><code class="php">
class HogeImage extends BaseHogeImage
{
public function postDelete($event) postDelete()
{
$this->File->delete();
}
}
</code></pre>

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

戻る