Удалить все сообщения, связанные с пользователем в laravel - PullRequest
0 голосов
/ 02 июня 2018

это моя таблица сообщений

   public function up()
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->increments('id');
                $table->unsignedInteger('user_id');
                $table->integer('category_id')->unsigned()->index();
                $table->integer('photo_id')->default(0)->unsigned()->index();
                $table->string('title');
                $table->text('body');
                $table->timestamps();

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


            });
        }

это моя таблица пользователей

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('role_id')->index()->unsigned()->nullable();
            $table->integer('photo_id')->index()->default(0);
            $table->boolean('is_active')->default(0);
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

это отношения

 public function posts() {
        return $this->hasMany('App\Post');
    }

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

Удалить код пользователя

public function destroy($id)
    {
        $user = User::findOrFail($id);

        if($user->photo_id !== 0) {
            unlink(public_path() . $user->photo->path);
        }


        $user->delete();

        Session::flash('deleted_user', 'The user has been deleted.');

        return redirect('/admin/users');
    }

Удалить код сообщения

public function destroy($id)
    {
        $post = Post::findOrFail($id);

        if($post->photo_id !== 0) {
            unlink(public_path() . $post->photo->path);
        }


        $post->delete();

        return redirect('/admin/posts');

    }

Я пытаюсь удалить все сообщения, связанные с пользователем, когда я удаляю пользователя.Для этого я использую ограничение внешних ссылок в таблице сообщений, как показано выше, но оно не работает, когда я удаляю пользователя.Сообщения все еще там.Я не знаю, что я делаю неправильно

Ответы [ 4 ]

0 голосов
/ 04 августа 2018

Альтернативный способ решить эту проблему - настроить файл database.php в папке laravel-project \ config для работы на движке InnoDB.

'mysql' => [
   ...

   'engine' => 'InnoDB'
 ]

Теперь вам не нужно беспокоиться, когда вы используете иностранныйключи ... ПОМНИТЕ - если вы не настроили это до создания таблиц, вам следует выполнить повторную миграцию.

0 голосов
/ 02 июня 2018

Создайте свой собственный метод, например function destroyAllByUser()

, и введите код, например

DB::table('posts')->where('user_id', '=', 1)->delete();

Надеюсь, это может помочь

0 голосов
/ 02 июня 2018

Удалить пользователя;

public function destroy($id)
{
    $user = User::findOrFail($id);

    if($user->photo_id !== 0) {
        unlink(public_path() . $user->photo->path);
    }

    $user->posts->delete();

    $user->delete();

    Session::flash('deleted_user', 'The user has been deleted.');

    return redirect('/admin/users');
}
0 голосов
/ 02 июня 2018

Эта проблема возникает, скорее всего, потому, что механизм таблиц по умолчанию в вашем экземпляре MySQL установлен на MyISAM, который не поддерживает внешние ключи.Попытка работать с внешними ключами в таблице MyISAM определенно не будет ошибкой в ​​Laravel.Хотя было бы неплохо, если бы Schema Builder мог автоматически установить движок на InnoDB, если используются внешние ключи.

, поэтому используйте эту строку в своей схеме

$table->engine = 'InnoDB';

или измените таблицу с помощью

ALTER TABLE table_name ENGINE=InnoDB;

Может вам помочь.

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