我无法弄清楚问题是什么,由于某种原因,两个表没有连接,我阅读了很多文章并尝试了很多东西仍然不起作用。
我想将帖子和类别表链接在一起,以便何时可以显示所发布的帖子中选择的类别。
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->string('name');
$table->text('description');
$table->integer('category_id');
$table->integer('price');
$table->integer('currency_id');
});
}
类别
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('name');
$table->bigInteger('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts');
});
}
这是我得到的错误:
SQLSTATE[42S01]:基表或视图已存在:1050 表 "类别"已存在(SQL:创建表
categories
(id
Bigint 无符号不为空 auto_increment主键,created_at
时间戳空,updated_at
时间戳空,name
varchar(255) not 空,post_id
bigint 无符号 不为空)默认字符集 UTF8MB4 整理"utf8mb4_unicode_ci")
尝试使用migrate:refresh
artisan 命令完全刷新数据库。
php artisan migrate:refresh --seed
可能是数据库迁移在数据库的migrations
表中注册之前运行并失败。
问题:(到目前为止)
1)如上所述,migrate:refresh
整理原始错误
2)$table->bigInteger('post_id')->unsigned();
不起作用,因为posts.id
是integer
而不是bigInteger
。
溶液:
将post_id
定义更改为
$table->integer('post_id')->unsigned();
它说类别表已经存在。所以你要做的是,如果你在dev env中,你可以删除表并尝试一下,或者你可以像下面的命令一样做。
像这样运行工匠,它会删除所有表并更新鲜地迁移。
php artisan migrate:fresh
这对我有用。
答案很简单,您必须将帖子表中的$table->increments('id')
更改为$table->id()
,因为外键必须引用消息所说的主键。
这里有一些提示给你
-
您必须在posts表中使用
出现问题bigIncrements
而不是integer
因为integer
的长度是4字节,但bigIncrements
是8 字节,这可能会导致将来 -
你可能喜欢使用这条线
$table->foreignId('post_id')->constrained();
相反
$table->bigInteger('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts');
为简单起见
虽然,这是一个过去的问题,但我找到了一个非常好和简单的解决方案;
-
检查您的类别和迁移后文件 检查您的迁移文件并检查
public function up
和public function down
是否正确tables_names,然后检查您的 http://localhost/phpmyadmin/index.php,然后转到您的数据库 -
检查迁移表 在数据库中,检查
migrations
表,如下所示 迁移表中某些行的图片,您会发现这两个表(帖子和类别)不在里面 -
复制迁移文件的名称转到
laravel-app/database/migrations
文件夹或 IDE 到名为迁移的文件夹,然后复制两个迁移文件的名称
创建新的迁移行并将复制的名称粘贴 回本地主机数据库迁移表,为两个复制的名称创建新行,并相应地以数字方式粘贴名称 和 然后再次运行迁移。它完成了
php artisan migrate
对我来说,问题是工匠/拉拉维尔缓存在迁移的地方 所以我跑php artisan optimize:clear
它不再工作而没有错误