SQLSTATE [HY000] Laravel 8 中的外键约束格式错误
Posted
技术标签:
【中文标题】SQLSTATE [HY000] Laravel 8 中的外键约束格式错误【英文标题】:SQLSTATE[HY000] Foreign key constraint is incorrectly formed error in Laravel 8 【发布时间】:2021-08-18 04:17:47 【问题描述】:SQLSTATE[HY000]:一般错误:1005 无法创建表
laravel
.projects
(errno: 150 "外键约束为 格式不正确")
当我迁移我的项目表并尝试加入三个表时出现上述错误:
-
一个用户有很多产品,产品有自己的ID。
一个产品有很多项目,项目有自己的id。
用户表(user.php)
public function up()
Schema::create('users', function (Blueprint $table)
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->foreignId('current_team_id')->nullable();
$table->text('profile_photo_path')->nullable();
$table->timestamps();
);
产品表(product.php)
public function up()
Schema::create('products', function (Blueprint $table)
$table->bigIncrements('id');
$table->string('name');
$table->text('detail');
$table->string('color');
$table->string('image');
$table->string('logo');
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
);
项目表(project.php)
Schema::create('projects', function (Blueprint $table)
// $table->('id');
$table->bigIncrements('id');
$table->string('name', 255)->nullable();
$table->string('detail', 500)->nullable();
$table->string('color', 255)->nullable();
$table->string('image', 22)->nullable();
$table->string('logo', 22)->nullable();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('product_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable();
);
用户模型
public function getProducts()
return $this->hasMany('App\Models\Product');
public function getProject()
return $this->hasMany('App\Models\Project');
产品型号
use HasFactory;
protected $fillable = [
'name', 'detail', 'image', 'color', 'logo', 'user_id'
];
public function getUser()
return $this->belongsTo(User::class);
项目模型
use HasFactory;
protected $fillable = [
'name', 'detail', 'image','color','logo','user_id'
];
public function getUser()
return $this->belongsTo(User::class);
我还需要帮助才能使我的模型正常工作。
【问题讨论】:
更改用户表 $table->id();到 $table->bigIncrements('id'); C:\xampp\htdocs\ContentBaseApp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:471 PDOException::("SQLSTATE[HY000]: 一般错误:1005 Can' t 创建表laravel
.projects
(errno: 150 "外键约束格式不正确")")
更改后显示此错误
PDOException::("SQLSTATE[HY000]: 一般错误: 1005 无法创建表laravel
.projects
(errno: 150 "外键约束格式不正确")") 之后更改显示此错误
我已经在我的系统中验证了。如果你改变 $table->id();到 $table->bigIncrements('id');在用户迁移中它工作正常。我从您的问题中复制了相同的迁移
【参考方案1】:
您的问题很简单,您需要阅读并了解更多关于关系查询构建和表旋转多对多的信息
示例项目和用户
Schema::create('projects_user', function (Blueprint $table)
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('product_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable();
);
php artisan make:migration create_projects_user_table --create=projects_user
很导入搜索create tables corrument用
检查是西班牙语请您搜索英语替代 youtube relation many to many
【讨论】:
【参考方案2】:问题是在 Laravel 8+ 中创建的,通常所有的答案都与一些旧版本有关,我搜索了很多但没有得到 8.4x 版本的解决问题,最后我尝试了不同的方法解决这个问题,现在在尝试了多种方法后,我找到了解决方案。 尝试更改这些文件 Product.php 和 Project.php 文件。 100% 对你有用。
产品表(product.php)
public function up()
Schema::create('products', function (Blueprint $table)
$table->bigIncrements('id');
$table->string('name');
$table->text('detail');
$table->string('color');
$table->string('image');
$table->string('logo');
$table->unsignedBigInteger('user_id')->nullable()->index();//Change this line of Code
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')-
>onDelete('cascade');
);
项目表(project.php)
Schema::create('projects', function (Blueprint $table)
// $table->('id');
$table->bigIncrements('id');
$table->string('name', 255)->nullable();
$table->string('detail', 500)->nullable();
$table->string('color', 255)->nullable();
$table->string('image', 22)->nullable();
$table->string('logo', 22)->nullable();
$table->unsignedBigInteger('user_id')->nullable()->index(); //Change this line of Code
$table->unsignedBigInteger('product_id')->nullable()->index();//Change this line of Code
$table->foreign('user_id')->references('id')->on('users')-
>onDelete('cascade');
$table->foreign('product_id')->references('id')->on('products')-
>onDelete('cascade');
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable();
);
【讨论】:
【参考方案3】:对于项目表,Laravel 会自己解决。
Schema::create('projects', function (Blueprint $table)
// $table->('id');
$table->bigIncrements('id');
$table->string('name', 255)->nullable();
$table->string('detail', 500)->nullable();
$table->string('color', 255)->nullable();
$table->string('image', 22)->nullable();
$table->string('logo', 22)->nullable();
$table->foreignId('user_id')
->constrained()
->onDelete('cascade');
$table->foreignId('product_id')
->constrained()
->onDelete('cascade');
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable();
);
【讨论】:
C:\xampp\htdocs\ContentBaseApp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:471 PDOException::("SQLSTATE[HY000]: 一般错误:1005 Can' t create tablelaravel
.projects
(errno: 150 "Foreign key constraint is wrongly forms")") 这是现在的错误
为什么在您的模型中使用 getUser() ,我的意思是使用 get 使其成为访问器,这是另一回事
你可以试试 user() 和 products() 还有 projects() ,你需要一个 s ,这样 laravel 可以理解关系和猜表以上是关于SQLSTATE [HY000] Laravel 8 中的外键约束格式错误的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 7 SQLSTATE [HY000] [2002] 连接被拒绝
Laravel 6.0 迁移 - SQLSTATE[HY000] [2002] 没有这样的文件或目录
SQLSTATE[HY000] [2002] 连接被拒绝 Laravel 5.8.35
SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005
PHP + MYSQL + Laravel - “SQLSTATE [HY000] [2002] 连接被拒绝” [重复]