简单的问题:我是Laravel的新手。我有这个迁移文件:
Schema::create('lists', function(Blueprint $table) {
$table->increments('id');
$table->string('title', 255);
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
我想更新它以添加onDelete('cascade')
。
最好的方法是什么?
答案 0 :(得分:19)
首先,您必须将user_id
字段设为索引:
$table->index('user_id');
之后,您可以使用级联操作创建外键:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
如果您希望通过新的迁移执行此操作,则必须先删除索引和外键,然后从头开始执行所有操作。
在down()函数中你必须这样做然后在up()做我上面写的:
$table->dropForeign('lists_user_id_foreign');
$table->dropIndex('lists_user_id_index');
$table->dropColumn('user_id');
答案 1 :(得分:5)
在Laravel 7中,它可以一行完成
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
答案 2 :(得分:3)
您应该创建一个新的迁移文件,例如'add_user_foreign_key.php'
public function up()
{
Schema::table('lists', function(Blueprint $table)
{
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('lists', function(Blueprint $table)
{
$table->dropForeign('user_id'); //
});
}
跑步
php artisan migrate
答案 3 :(得分:2)
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
在此示例中,我们声明 user_id 列引用了用户表中的 id 列。确保首先创建外键列! user_id 列声明为无符号,因为它不能具有负值。
您还可以为约束的“on delete”和“on update”操作指定选项:
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
要删除外键,您可以使用 dropForeign 方法。与其他索引一样,外键使用类似的命名约定:
$table->dropForeign('posts_user_id_foreign');
如果您对 Laravel 和 Eloquent 还不熟悉,请尝试使用laracasts上提供的 Laravel From Scratch 系列。这对初学者来说是一个很好的指南。
答案 4 :(得分:1)
Laravel 7.x外键约束
Laravel还提供了对创建外键约束的支持,这些外键约束用于强制数据库级别的参照完整性。例如,让我们在user_id
表上定义一个posts
列,该列引用一个users表上的id
列:
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
由于此语法相当冗长,因此Laravel提供了其他的,更简短的方法,这些方法使用约定来提供更好的开发人员体验。上面的示例可以这样写:
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained();
});
答案 5 :(得分:0)
如果要添加onDelete('cascade')
,只需删除索引并再次创建它们:
public function up()
{
Schema::table('lists', function($table)
{
$table->dropForeign('lists_user_id_foreign');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down()
{
Schema::table('lists', function($table)
{
$table->dropForeign('lists_user_id_foreign');
$table->foreign('user_id')->references('id')->on('users');
});
}
答案 6 :(得分:0)
Schema::create('roles',function(Blueprint $table){
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
Schema::create('permissions',function(Blueprint $table){
$table->unsignedBigInteger('role_id');
$table->foreign('role_id')->references('id')->on('roles');
$table->string('permission');
});
答案 7 :(得分:0)
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
答案 8 :(得分:0)
我在做同样的事情,但是出现错误“ id不存在” =>,所以我如下更改了迁移文件:
问题表迁移内容:
$ table-> id()=>应该更改为$ table-> increments('id')
答复表中外键的定义:
$ table-> foreign('question_id')-> references('id')-> on('questions')-> onDelete('cascade');
现在您的外键将可用。
答案 9 :(得分:0)
假设您有两个表student和section,可以参考以下两个表结构来添加外键并制作onDelete('cascade')。
表-1:
public function up()
{
Schema::create('student', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('address');
$table->string('phone');
$table->string('about')->nullable();
$table->timestamps();
});
}
表-2:
public function up()
{
Schema::create('section', function (Blueprint $table) {
$table->id();
$table->bigInteger('student_id')->unsigned()->index()->nullable();
$table->foreign('student_id')->references('id')->on('student')->onDelete('cascade');
$table->string('section')->nullable();
$table->string('stream')->nulable();
$table->timestamps();
});
}
希望它将对您有帮助-:) 您可以从here阅读全文。
答案 10 :(得分:0)
从 Laravel 8 开始:
$table->foreignIdFor(OtherClass::class);
很简单:)
改用这个:
$table->foreignId('otherclass_id')->index()->constrained()->cascadeOnDelete();