我试图用php artisan migrate设置我的'books'表的外键和'categories'表,但是我得到了下面的错误:
Illuminate\Database\QueryException
SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'categories' (SQL: alter table `books` add constraint `books_category_id_foreign` foreign key (`category_id`) references `categories` (`id`))
书籍迁移文件:
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('categories');
$table->string("image");
$table->string("title");
$table->string("description")->nullable();
$table->string("author");
$table->string("cover");
$table->integer("nod")->nullable();// Number of downloads
$table->integer("rating")->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('books');
}
类别迁移文件:
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->string("title");
$table->string("image");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('categories');
}
我真的需要帮助,这在我的移动的应用程序API使用。我希望有人能帮助我。
9条答案
按热度按时间syqv5f0l1#
问题出在迁移本身,请仔细查看
您试图打开
categories
表,但它基本上不存在或尚未创建。如果您使用图形用户界面,如HeidiSQL或Navicat或PMA,您将能够看到它。Laravel迁移采用文件开头的时间戳来决定顺序中应首先迁移哪个迁移。
确保在创建books表之前先创建categories表(这也适用于任何有引用的表)。或者简单地重命名文件(更改时间戳),例如:
到这个
然后运行
php artisan migrate:fresh
以刷新迁移。pw136qt22#
您尝试在创建类别表之前获取图书类别,但图书表无法理解您引用的内容。
溶液#1
在图书表之前声明类别表,只需在迁移文件名中重命名日期。类别表必须在图书表之前创建。
溶液#2
创建类别表后创建引用。
从图书迁移中删除
$table->foreign('category_id')->references('id')->on('categories');
,并在更新类别表后创建引用。类别迁移文件:
主要思想是在创建所有表时创建所有关系。另外,使用
php artisan migrate:fresh
快速擦除和重新创建表bq3bfh9z3#
我昨天和你们也遇到了同样的问题,后来我看到了我的错误,我明白了问题的原因,有很多因素要考虑
1.确保父表(categories)的日期早于子表(books)的日期,以便在迁移过程中首先创建父表,因为子表可能要引用不存在的表中的id。
1.请确保遵循命名约定
**$表-〉外部ID(“类别ID ")-〉受约束(”类别“);**或
$table-〉外部ID(“类别ID ")-〉受约束();
我的迁移文件之一的示例
dz6r00yl4#
我刚才也犯了同样的错误。
它与创建这些迁移有关。
我遇到的问题是因为我手动重构了表名,没有考虑表之间的连接,并立即尝试迁移它们。
我所做的解决方案是手动删除迁移,然后使用
php make:magirate
重新创建它们。jvidinwx5#
在我看来,您需要将SQL的引擎更改为InnoDB,这个问题困扰了我很长时间,您需要做的就是添加
到表迁移文件
参考:https://web-brackets.com/discussion/4/-solved-sqlstate-hy000-general-error-1824-failed-to-open-the-referenced-table-alter-on-foreign-key-
jucafojl6#
您引用其“ID”的表(Categories)未创建或创建在“books”表之后。您可以手动删除这两个表,然后以“Categories”为第一个重新创建它们,或者您可以手动将“Categories”的日期更改为“books”之前的日期,这样就可以开始了。
8ljdwjyq7#
请确保您的数据库中有这样的表。如果您使用大量数据库,则需要指定要约束的数据库
连接数据库=数据库::连接('连接名称')-〉getDatabaseName();$table-〉外部(“类别标识”)-〉引用(“标识”)-〉在(“$connection_db.categories”)上;
mpgws1up8#
确保使用相同的引擎创建两个表,在我的例子中,我使用两个不同的引擎(MyISAM和InnoDB)创建了两个表,将两个表引擎都改为InnoDB就可以了。
mrfwxfqh9#
必须首先为引用的表创建迁移文件,例如
1.产物迁移
1.订单迁移
那么你可以使用php工匠迁移订单相关的产品.如果你创建这样:
1.订单迁移
1.产物迁移
这将抛出错误字段以打开引用表