8

互いに1対多に関連する3つのモデルがあります。

class Country extends Model
{
    protected $fillable=['name','sort'];
    public $timestamps=false;

    public function region(){
        return $this->hasMany('App\Models\Region');
    }
}

領域

class Region extends Model
{

    protected $fillable=['country_id','name','sort'];
    public  $timestamps=false;

    public function country()
    {
        return $this->belongsTo('App\Models\Country');
    }

    public function city()
    {
        return $this->hasMany('App\Models\City');
    }
}

class City extends Model
{
    protected $table='cities';
    protected $fillable=['region_id','name','sort'];
    public  $timestamps=false;

    public function region()
    {
        return $this->belongsTo('App\Models\Region');
    }
}

国を自動的に削除すると、すべての子アイテムの関係が削除されます。つまり、この国の地域と都市が削除されます

私はそうしています:

モデル国

    public  static function boot() {
        parent::boot();

        static::deleting(function($country) {
            //remove related rows region and city

            // need an alternative variation of this code
            $country->region()->city()->delete();//not working
            $country->region()->delete();

            return true;
        });
    }
}

また

モデル地域

public  static function boot() {
        parent::boot();
        // this event do not working, when delete a parent(country)
        static::deleting(function($region) {
            dd($region);
            //remove related rows city
            $region->city()->delete();
            return true;
        });
    }
}

カスケードのオプションはデータベースを削除します。提供しないでください

アップデート

答えを見つけた

関連するモデルを削除するには、クエリビルダーにクロージャーを使用します

モデル国

public  static function boot() {
        parent::boot();

        static::deleting(function($country) {
            //remove related rows region and city
            $country->region->each(function($region) {
                $region->city()->delete();
            });
            $country->region()->delete();//
            return true;
        });
    }

Laravel Eloquent ORM - 行とすべての内部関係を削除する

4

2 に答える 2

2

簡単な要約:

$model->related_model関連するモデルを返します。
$model->related_model()関係オブジェクトを返します。

$model->related_model->delete()またはモデルのメソッドに$model->related_model()->get()->delete()アクセスすることができます。delete()

関連(またはサブ)モデルの削除を処理する別の方法は、移行を記述するときに外部キー制約を使用することです。 https://laravel.com/docs/master/migrations#foreign-key-constraintsを確認してください

于 2016-01-25T23:45:55.953 に答える