Удалить строки через красноречивые отношения - PullRequest
1 голос
/ 17 апреля 2019

У меня есть таблицы "проекты" и "задачи".Каждый проект может иметь несколько задач, поэтому его отношение один ко многим.

Каскад onDelete не работает для меня

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

 Schema::create('tasks', function (Blueprint $table) {

            $table->increments('task_id')->default($value=null)->unsigned();

            $table->integer('proj_id')->nullable()->default($value=null)->foreign('proj_id')->references('proj_id')->on('projects')->onDelete('cascade');

public function up()
    {
        Schema::create('projects', function (Blueprint $table) {

            $table->increments('proj_id')->nullable()->default($value=null)->foreign('proj_id')->references('proj_id')->on('tasks')->onDelete('cascade');

А это мои модели;

class Project extends Model
{
    protected $primaryKey = 'proj_id';
    protected $fillable = ['proj_title','proj_desc','client_id','created_by'];



    public function client (){
        return $this->belongsTo('App\Client');
    }
    public function task (){
        return $this->hasMany('App\Task');
    }
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $primaryKey = 'task_id';

    protected $fillable = ['task_title','task_desc','status','priority','person_id','proj_title','proj_id','created_by'];

    public function project(){

        return $this->belongsTo('App\Project','proj_id');
    }

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Если у вас нет веских оснований называть столбцы такими, какими вы являетесь, я бы предложил следовать соглашению и изменить ваши миграции на ...

Schema::create('tasks', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('project_id');
    // other columns...

    $table->foreign('project_id')
        ->references('id')->on('projects')
        ->onDelete('cascade');
});

Schema::create('projects', function (Blueprint $table) {
    $table->increments('id');
    // other columns...
});

Инкременты не должны иметь значения по умолчанию, так как это основной идентификатор, а также по умолчанию он не подписан.

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

В качестве дополнительной информации довольно часто вам потребуется больше функциональности, чем просто каскадное удаление. Laravel предлагает события и слушателей, которые можно использовать для получения требуемого поведения - https://laravel.com/docs/5.8/eloquent#events. Это объясняет, как вы можете достичь того, что вам нужно, путем создания наблюдателя модели.

Я бы порекомендовал не торопиться, чтобы ознакомиться с вышеизложенным. Хотя вы также можете получить те же результаты, добавив следующий метод в класс Project,

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

    static::deleting(function(Project $project) {
        $project->tasks()->delete();
    });
}
0 голосов
/ 17 апреля 2019

Вам просто нужен внешний ключ для proj_id таблицы задач, а не наоборот, поэтому сначала удалите внешний ключ в первичном столбце проектов.

Кроме того, тип столбца внешнегоТаблица задач должна соответствовать первичному ключу таблицы проектов.Вам нужно использовать unsignedInteger , так как increments в таблице проектов создаст первичный ключ без знака с автоматическим приращением.

$table->unsignedInteger('proj_id')->nullable()->default(null);
$table->foreign('proj_id')->references('proj_id')->on('projects')->onDelete('cascade');

Затем перезапустите миграцию, и она должна работатьЧто ж.Если у вас есть какие-либо ошибки, обновите свой ответ

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