У меня есть проект laravel с отношением один к одному. Но у меня проблема, я не могу удалить данные. Код выглядит совершенно нормально, никаких ошибок не появляется, но он не может удалить данные.

Это моя структура таблицы

Учительский стол

  • мне бы
  • название
  • имя пользователя
  • щипать

Келас стол

  • нама_келас
  • имя пользователя
  • учитель_ид

Таблица келас миграции:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateKelasTable extends Migration
{
    public function up()
    {
        Schema::create('kelas', function (Blueprint $table) {
            $table->id();
            $table->string('nama_kelas');
            $table->string('username')->unique();
            $table->foreignId('teacher_id')->constrained()->cascadeOnDelete();
            $table->timestamps();
        });
    }
}

Таблица учителей миграции:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTeachersTable extends Migration
{
    public function up()
    {
        Schema::create('teachers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('username')->unique();
            $table->bigInteger('nip')->unique()->nullable();
            $table->timestamps();
        });
    }
}

Модель учителя:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Teacher extends Model
{
    use HasFactory;

    protected $guarded = ['id'];

    public function kelas()
    {
        return $this->hasOne(Kelas::class);
    }

    public function getRouteKeyName()
    {
        return 'username';
    }
}

Келас Модель:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Kelas extends Model
{
    use HasFactory;

    protected $guarded = ['id'];

    public function teacher()
    {
        return $this->belongsTo(Teacher::class);
    }

    public function getRouteKeyName()
    {
        return 'username';
    }
}

Kelas Удалить контроллер:

public function destroy(Kelas $kelas)
{
    $kelas->delete();

    return redirect('/kelas');
}

Кнопка Удалить:

<form action="{{ route('kelas.destroy', $k->username) }}" method="POST" class="d-inline">
    @method('DELETE')
    @csrf
    <button onclick="return confirm('Are you sure you want to delete this post?')">
        Delete
    </button>
</form>
0
Berliano Ridho Pratama 17 Янв 2022 в 12:02
1
Является ли $k->username идентификатором, потому что если это не так, вы не получите экземпляр, используя внедрение зависимостей в контроллере удаления Kelas public function destroy(Kelas $kelas)
 – 
geeky
17 Янв 2022 в 21:27
Да, @geeky прав, действие формы должно быть route('kelas.destroy', $k->id). Голосование за закрытие как опечатка.
 – 
miken32
17 Янв 2022 в 23:04
1
Можете ли вы показать нам свой маршрут?
 – 
Don't Panic
18 Янв 2022 в 00:54
Я использую привязку модели маршрута. на основе документации laravel, если я хочу использовать столбец, отличный от id, при получении класса модели, мне нужно переопределить метод getRouteKeyName в моей модели Eloquent. laravel.com/docs/8.x/routing# настройка имени ключа по умолчанию
 – 
Berliano Ridho Pratama
18 Янв 2022 в 03:30
О, извините, я не заметил, что вы переопределяете метод в своем классе. Вы должны показать определение маршрута в своем вопросе.
 – 
miken32
18 Янв 2022 в 04:56

3 ответа

Лучший ответ

Я не думаю, что каскадное удаление работает на laravel так, как мы ожидаем (поправьте меня, если я ошибаюсь), однако вы можете использовать наблюдателя на нужной вам модели, и как только событие удаления запускается, вы автоматически удалить отношения. взгляните на ответ на этот ранее заданный вопрос:

Автоматическое удаление связанных строк в Laravel (Eloquent ORM)

Из документации laravel: https://laravel.com/docs/8.x/eloquent#observers

-1
Marwane Ezzaze 18 Янв 2022 в 15:38

Можешь попробовать этот код

public function destroy(Kelas $kelas)
{
   $kelas->teacher()->delete(); // delete for relation 
   $kelas->delete(); // delete row in table
   return redirect('/kelas');
}
-1
mohammad shelkhi 18 Янв 2022 в 21:29
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте, чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
 – 
Community
18 Янв 2022 в 16:42

Ты можешь попробовать

Kelas::destroy($kelas->id);
-3
Alper 17 Янв 2022 в 12:20
Я пробовал этот метод, но он не работает. Я искал решение в Интернете, но пока это не сработало.
 – 
Berliano Ridho Pratama
17 Янв 2022 в 16:21
См. «Объяснение полностью основанных на коде ответов». Хотя это может быть технически правильным, но не объясняет, почему он решает проблему или должен быть выбранным ответом. Мы должны обучать, чтобы помочь решить проблему.
 – 
the Tin Man
19 Янв 2022 в 00:52