通过雄辩的关系删除行

时间:2019-04-17 08:34:05

标签: php laravel

我有表格“项目”和“任务”。每个项目可能有多个任务,因此一对多关系。

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 个答案:

答案 0 :(得分:1)

除非您有充分的理由为列命名,否则我建议遵循惯例并将您的迁移更改为...

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...
});

增量不应具有默认值,因为它是主要ID,并且默认情况下也未签名。

如果进行上述更改,则需要更新模型中的关系定义。这应该可以消除您的错误。

作为一点额外的东西,很多时候,您将需要更多功能,而不仅仅是简单地级联删除操作。 Laravel提供了事件和侦听器,可用于获取所需的行为-https://laravel.com/docs/5.8/eloquent#events。这说明了如何通过创建模型观察器来实现所需的功能。

我建议您花些时间熟悉以上内容。尽管您也可以通过将以下方法添加到Project类中来获得相同的结果,

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

    static::deleting(function(Project $project) {
        $project->tasks()->delete();
    });
}

答案 1 :(得分:0)

您只需要在任务表的proj_id上使用外键,而不是相反,因此首先在项目的主列上删除外键。

此外,外表在任务表上的列类型必须与项目表上的主键匹配。您需要在项目表上使用 unsignedInteger 作为 increments ,这将创建一个无符号自动增量整数主键。

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

然后重新运行迁移,它应该运行良好。如果有任何错误,请更新答案