Как удалить пользователя и автоматически все его отношения, используя «Каскад»? - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь удалить пользователя и автоматически все его отношения, используя 'каскад'.Не уверен, как это сделать.Я использую MySQL.Пока я сделал это:

Модель пользователя

class User extends Authenticatable
{
    use Notifiable;

    //...

    public function profile()

    {
        return $this->hasOne('App\Profile');
    }
}

Модель профиля

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

Профиль миграции

    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->integer('phone');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

И с повозкойЯ пытаюсь сделать:

$user = App\User::firsts();
$user->delete(); // it deletes only the user

$user->profile->delete(); // it deletes only the profile

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Вы можете использовать модельные события:

class User extends Eloquent
{    
    public static function boot ()
    {

        parent::boot();

        self::deleting(function ($user) {
            // This will be executed right before the user is deleted
            $user->profile->delete();
        });
    }
}

Таким образом, всякий раз, когда вы вызываете метод delete() для объекта User, Laravel будет запускать $user->profile->delete(); прямо перед этим.

1 голос
/ 12 мая 2019

Там нет необходимости делать отношения сотрудников для работы с каскадом.Этот код прекрасно работает для меня -

Миграция:

Schema::create('profiles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->integer('phone');
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });

Контроллер: Здесь ->delete() может удалить как пользователя, так и строку профиля

public function deleteUser(){
    Auth::user()->delete();
    return redirect()->back();
}

Просмотреть Удалить ссылку

<a href="{{ route('deleteUser') }}">Delete</a>

Маршрут

Route::get('/delete', 'HomeController@deleteUser')->name('deleteUser');
1 голос
/ 12 мая 2019

Вместо каскада базы данных вы можете удалить связанную модель при удалении пользователя, удалив связанную модель с помощью события удаления.

Включите это в функцию загрузки пользовательской модели:

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

        self::deleting(function (User $user) {

            $user->profile->delete();

        });
    }
...