Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过有说服力的关系删除行_Php_Laravel - Fatal编程技术网

Php 通过有说服力的关系删除行

Php 通过有说服力的关系删除行,php,laravel,Php,Laravel,我有表“项目”和“任务”。每个项目可以有多个任务,因此是一对多的关系 onDelete cascade对我不起作用 当我删除一个项目,然后执行任务时,我会得到一个错误。 所以我需要,当你删除一个项目时,它会删除与此相关的所有任务。 这是我的迁徙 Schema::create('tasks', function (Blueprint $table) { $table->increments('task_id')->default($value=null)-&

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

onDelete cascade对我不起作用

当我删除一个项目,然后执行任务时,我会得到一个错误。 所以我需要,当你删除一个项目时,它会删除与此相关的所有任务。 这是我的迁徙

 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');

这些是我的模型

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

除非您有充分的理由按照自己的方式命名这些列,否则我建议您按照惯例将迁移更改为

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提供事件和侦听器,可用于获得所需的行为-。这说明了如何通过创建模型观察者来实现所需

我建议您花点时间熟悉上述内容。虽然您也可以通过将以下方法添加到
项目
类中来获得相同的结果

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

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

您应该只需要tasks表的proj_id上的外键,而不是反过来,因此首先删除项目主列上的外键

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

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

然后重新运行迁移,它应该可以正常工作。如果您有任何错误,请更新您的答案

您会遇到什么错误?还是记录没有被删除?记录没有被删除谢谢你的回答,我会调查的。我添加了这段代码,但我得到了“SQLSTATE[42S22]:Column not found:1054未知列'tasks.project\u proj\u id'in'where子句'”啊,要么更新你的
project
方法
task()
tasks()
(这更好地描述了这种关系),要么将我发布的代码从
tasks()
改为
task()
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...
});
protected static function boot() {
    parent::boot();

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