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