您好我试图在我的迁移中定义关系
我使用删除限制来防止在孩子出现时删除父记录。但它不起作用。例如,我有这个具有版本(子)的事件表(父)。我在版本表中使用了event_id
使用onDelete('restrict')
并在我的版本表中使用event_id
它应该限制我从事件表中删除因为长记录在版本表中有子记录吗?但它不是..
以下是两个表的迁移
事件(父母)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEventsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('events', function (Blueprint $table) {
//master table
$table->increments('event_id');
$table->string('name');
$table->text('full_name');
$table->text('description');
$table->tinyInteger('status');
$table->integer('created_by');
$table->integer('updated_by');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('events');
}
}
版本(儿童)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEditionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('editions', function (Blueprint $table) {
$table->increments('edition_id');
$table->integer('event_id')->unsigned();
$table->string('name');
$table->dateTime('start')->nullable();
$table->dateTime('end')->nullable();
$table->enum('stage', ['Archived', 'Cancelled', 'Closed', 'Live', 'On-site', 'Pre-event', 'Sold out'])->nullable()->default('Pre-event');
$table->tinyInteger('status');
$table->integer('created_by');
$table->integer('updated_by');
$table->timestamps();
});
Schema::table('editions', function($table) {
$table->foreign('event_id')
->references('event_id')->on('events')
->onDelete('restrict')->onUpdate('restrict');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('editions');
}
}
答案 0 :(得分:2)
我在外键定义中看到的一件事就是在其上添加一个索引,这是外键的一个要求,它可能是你的问题所在。
尝试更改
ClassCastException
到
$table->integer('event_id')->unsigned();
此外,您只需在列定义后立即添加外键定义,无需将其放在不同的$table->integer('event_id')->unsigned()->index();
块中。
答案 1 :(得分:2)
根据thread:
如果您使用的是SoftDeletes特征,则调用delete() 模型上的方法只会更新你的模型中的deleted_at字段 给定数据库,并且不会触发onDelete约束 它是在数据库级别触发,即DELETE查询时 执行。
因此请确保您使用DELETE
而不是SoftDeletes
,否则您可以手动添加约束。