Saya menggunakan Laravel 4.1 dan mencoba penghapusan berjenjang. Saya melakukan ini karena beberapa metode penghapusan menghapus aset terkait yang disimpan di S3, jadi mengandalkan penghapusan kaskade DB tidak cocok.
Katakanlah saya memiliki model Entri yang memiliki gambar dan banyak Opsi terkait yang juga memiliki gambar seperti yang ditunjukkan di bawah ini (dipotong agar singkatnya).
class Entry extends Eloquent {
public function image()
{
return $this->morphOne('Image', 'imageable');
}
public function options()
{
return $this->hasMany('Option');
}
protected static function boot() {
parent::boot();
static::deleting(function($entry) {
$image = $entry->image;
if($image !== null) {
$image->delete();
}
$entry->options()->delete()
//Option::where('entry_id', $entry->id)->delete(); This also doesn't work
});
}
}
class Option extends Eloquent {
public function entry()
{
return $this->belongsTo('Entry');
}
public function image()
{
return $this->morphOne('Image', 'imageable');
}
protected static function boot() {
parent::boot();
static::deleting(function($option) {
Log::info('Trying to delete an option object');
$image = $option->image;
if($image !== null) {
$image->delete();
}
});
}
}
Catatan : Saya melakukan penghapusan seperti yang direkomendasikan dalam jawaban ini.
Ketika saya memanggil $entry->delete() itu akan menghapus gambar dan entri itu sendiri namun penangan penghapusan tidak pernah dipanggil pada opsi (saya tidak melihatnya ditampilkan ke log). Namun jika saya menggunakan yang berikut ini dalam fungsi penghapusan Entri, semuanya berfungsi dengan baik.
foreach($entry->options as $option) {
$option->delete();
}
Mengapa $entry->options()->delete() tidak berfungsi? Apakah ini bug di Laravel atau saya melakukan kesalahan.