SQL Сервер ВКЛЮЧЕН, УДАЛЕН КАСКАД Ошибка в Laravel - PullRequest
0 голосов
/ 07 марта 2020

Я использую Laravel Framework; У меня есть несколько связанных таблиц,

Пользователь Таблица схем:

 Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

Артикул Таблица схем:

Schema::create('articles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->string("title");
        $table->string("slug")->unique();
        $table->text("cover");
        $table->text("body");
        $table->boolean("status")->default(1);
        $table->timestamps();
    });

Комментарий Таблица схем:

        Schema::create('comments', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger("user_id");
        $table->foreign("user_id")->references("id")->on("users")->onDelete('cascade');
        $table->unsignedBigInteger("article_id");
        $table->foreign("article_id")->references("id")->on("articles")->onDelete('cascade');
        $table->text("comment");
        $table->bigInteger("level");
        $table->boolean("status")->default(0);
        $table->timestamps();
    });

В таблице комментариев у меня есть этот важный код:

$table->unsignedBigInteger("user_id");
        $table->foreign("user_id")->references("id")->on("users")->onDelete('cascade');
        $table->unsignedBigInteger("article_id");
        $table->foreign("article_id")->references("id")->on("articles")->onDelete('cascade');

Я хочу, чтобы при удалении статьи или пользователя я хотел бы удалить свои комментарии при удалении пользователя или статьи, но это ошибка в SQL базе данных сервера.

форма ошибки SQL база данных сервера : введите описание изображения здесь

Когда я удалил этот метод

-> onDelete ('cascade');

Ошибка исчезает .

Мне определенно нужен соответствующий метод. Кто-нибудь может мне помочь решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Кажется, что вы используете cascade on delete даже для user, которые обращаются к нему. Я не думаю, что вам нужно удалять список, даже если пользователь, который не является создателем, но только имеет к нему доступ. Поэтому обновите следующее

Измените

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

на

$table->foreign("user_id")->references("id")->on("users")->onDelete('no action');
0 голосов
/ 08 марта 2020

Вместо этого используйте наблюдателя удаления, on delete cascade - не лучшая вещь.

Определите отношения в User модели:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function articles()
{
    return $this->hasMany(Article::class, 'user_id');
}

Затем реализуйте boot метод наблюдения за удалением записи

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

    static::deleting(function($user) {
        $user->articles()->delete();
    });
}

Вы можете l oop в комментариях к статьям тем же методом или сделать то же самое, что вы сделали здесь с Article и Comment моделями

Подробнее о наблюдателях здесь https://laravel.com/docs/5.8/eloquent#observers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...