我有表格“项目”和“任务”。每个项目可能有多个任务,因此一对多关系。
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');
}
预先感谢
答案 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');
然后重新运行迁移,它应该运行良好。如果有任何错误,请更新答案