我在运行时遇到此错误:
php artisan migrate:fresh
Illuminate \ Database \ QueryException:SQLSTATE [HY000]:常规 错误:外键定义中有1个未知列“ user_id”(SQL: 创建表“ users”(“ id”整数不为null,主键自动递增, “名称” varchar不为空,“电子邮件” varchar不为空,“用户名” varchar 不为空,“ email_verified_at”日期时间为空,“密码”为varchar不 null,“ remember_token” varchar null,“ created_at” datetime null, “ updated_at”日期时间为空,外键(“ user_id”)引用 删除级联上的“ users”(“ id”))
我正在关注youtube上的视频教程,该教程的代码如下:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProfilesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('profiles');
}
}
如果我复制并粘贴此代码,则会出现错误。因此,我搜索了stackoverflow,并找到了以下解决方案:
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
Schema::table('profiles', function (Blueprint $table){
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('profiles');
}
这是我的用户表:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('users');
}
但是今天,当我运行php artisan migrate:fresh
时,我再次遇到此错误。
我该如何解决?
谢谢
答案 0 :(得分:0)
这里清楚地提到了错误:
foreign key("user_id") references "users"("id") on delete cascade)
并且您没有名称为user_id
的列
语法是:
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns) <-- this must be a column in the table
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
,但在您的情况下,user_id
列在查询中不可用。因此,请添加该列或删除此约束代码,然后重试。
答案 1 :(得分:0)
此问题的原因是,配置文件表是在用户表之前创建的。 我有解决问题的技巧。
您应在迁移目录中重命名迁移文件。
例如让我的文件名像这样
运行“ artisan migration or migration:fresh”时会创建第一个用户表
为什么?因为首先创建的迁移文件是用户文件。您应仔细查看
解决方案: 因此,您只需要执行以下操作:重命名“ user”表,并将其命名为比“ profiles”表小的数字。这样就可以解决问题。
其他解决方案: 分别运行此命令后,删除所有迁移文件。
php artisan make:migration create_users_table
php artisan make:migration create_profiles_table
答案 2 :(得分:0)
尝试一下;
public function up()
{
Schema::dropIfExists('profiles');
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
那是迁移。在能够运行它之前;删除迁移表中“ CreateProfilesTable”的行。
答案 3 :(得分:0)
正如其他人所提到的,user_id
不是users
表中的一列,但是您正在尝试在其上创建索引。这行:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
属于profiles
表创建模式,而不属于users
表创建模式。
完整代码:
// create_users_table.php
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
// create_profiles_table.php <-- migrate AFTER users table
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}