Как мне каскадно удалить полиморфную таблицу? - PullRequest
0 голосов
/ 30 октября 2019

То, что я хотел бы сделать, это каждый раз, когда я удаляю ThoughtRecord, я хочу удалять комментарии, которые полиморфно принадлежат этому ThoughtRecord.

ThoughtRecordController

public function destroy(ThoughtRecord $thoughtRecord)
{
    $thoughtRecord->delete();
}

Модель ThoughtRecord

public function comments()
{
    return $this->morphMany('App\Comment', 'commentable');
}

Комментарий Модель

public function commentable()
{
    return $this->morphTo();
}

Таблица ThoughtRecord

$table->bigIncrements('id');
$table->integer('user_id');
$table->boolean('is_authorized')->default(false);
$table->string('title')->nullable();
$table->timestamps();

Таблица комментариев

$table->increments('id');
$table->integer('commentable_id');
$table->string('commentable_type');
$table->integer('user_id');
$table->text('content');
$table->timestamps();

1 Ответ

0 голосов
/ 30 октября 2019

Один вариант:

Управление каскадным удалением с помощью этого пакета:

Пакет для управления каскадным удалением

Второй вариант:

Вы можете прослушивать события, которые предоставляет Laravel

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

            // cause a delete of a poster to cascade
            // to children so they are also deleted
            static::deleting(function ($poster) {

                            $photos->photos->delete();

                        $poster->comments()->delete();

            });

    }

Третий вариант:

Когда вы используетеполиморфные отношения вы, вероятно, также используете это черта. В этом случае вы можете удалить отношения в методе загрузки признака, подключившись к событию удаления.

<?php namespace Company\Package\Traits;

/**
 * This file is part of Package.
 *
 * @license MIT
 * @package Company\Package
 */

use Illuminate\Support\Facades\Config;

trait ActionableTrait
{
    /**
     * Morph Many relation with Task.
     *
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
     */
    public function actions()
    {
        return $this->morphMany(Config::get('crm.action'),'actionable');
    }

    protected static function bootActionableTrait()
    {
        self::deleting(function ($model) {
            $model->actions()->delete();
        });
    }
}

Вариант четыре:

Простой код, Переопределить метод удаления на вашей модели. Если эта модель удалена, удалите другие связанные модели.

public function delete()
{
       $res=parent::delete();
       if($res==true)
       {
                $relations=$this->youRelation; // here get the relation data
                // delete Here
    }
}

прочитайте ее https://laravel.com/docs/5.8/eloquent-relationships#querying-polymorphic-relationships

...