如何在 Laravel 迁移中创建自引用关系(外键)?
How to create a self-reference relationship (foreign key) in a Laravel migration?
我从一个建立在 Laravel 5.2 之上的自学项目开始,我发现了我的第一个问题:迁移中的自我引用。
这是文件 2016_08_02_024942_create_navigation_table.php
的样子(我删除了注释,以免 post 太长):
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNavigationTable extends Migration
{
public function up()
{
Schema::create('navigation', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id')->unsigned();
$table->integer('position')->unsigned();
$table->string('title');
$table->string('slug');
$table->string('permissions')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
public function down()
{
Schema::drop('articles');
}
}
然后因为我在这里读了几个 post 像 this, this, this 和更多我用下面的代码创建了另一个文件,只包含名为 2016_08_02_030158_add_parent_to_navigation_table.php
的关系:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddParentToNavigationTable extends Migration
{
public function up()
{
Schema::table('navigation', function (Blueprint $table) {
$table->foreign('parent_id')->references('id')->on('navigation')->onUpdate('cascade')->onDelete('cascade');
});
}
public function down()
{
Schema::drop('articles');
}
}
但是当我 运行 命令 php artisan migrate
时出现以下错误,我不确定我做错了什么:
[Illuminate\Database\QueryException] SQLSTATE[42S01]: Base table or
view already exists: 1050 Table 'navigation' already exists (SQL:
create table navigation
(id
int unsigned not null auto_increment
primary key, position
int unsigned not null, title
varc har(255)
not null, slug
varchar(255) not null, permissions
varchar(255)
null, created_at
timestamp null, updated_at
timestamp null,
deleted_at
timestamp null) default character set utf8 collate
utf8_unicode_ci engin e = InnoDB)
[PDOException] SQLSTATE[42S01]: Base table or view already exists:
1050 Table 'navigation' already exists
可以给我一些建议吗?我做错了什么?我已经看到 this package 但我不确定它是否能解决我的问题。
SQLSTATE[42S01]: Base table or view already exists: 1050 Table
'navigation' already exists
表示你在数据库中有相同的table名字
所以你需要验证一下,你的数据库中没有任何table与name。
- 确保没有 table 同名的名字
运行再次迁移
php artisan migration:rollback
有时由于不同的原因无法删除 table。
我从一个建立在 Laravel 5.2 之上的自学项目开始,我发现了我的第一个问题:迁移中的自我引用。
这是文件 2016_08_02_024942_create_navigation_table.php
的样子(我删除了注释,以免 post 太长):
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNavigationTable extends Migration
{
public function up()
{
Schema::create('navigation', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id')->unsigned();
$table->integer('position')->unsigned();
$table->string('title');
$table->string('slug');
$table->string('permissions')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
public function down()
{
Schema::drop('articles');
}
}
然后因为我在这里读了几个 post 像 this, this, this 和更多我用下面的代码创建了另一个文件,只包含名为 2016_08_02_030158_add_parent_to_navigation_table.php
的关系:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddParentToNavigationTable extends Migration
{
public function up()
{
Schema::table('navigation', function (Blueprint $table) {
$table->foreign('parent_id')->references('id')->on('navigation')->onUpdate('cascade')->onDelete('cascade');
});
}
public function down()
{
Schema::drop('articles');
}
}
但是当我 运行 命令 php artisan migrate
时出现以下错误,我不确定我做错了什么:
[Illuminate\Database\QueryException] SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'navigation' already exists (SQL: create table
navigation
(id
int unsigned not null auto_increment primary key,position
int unsigned not null,title
varc har(255) not null,slug
varchar(255) not null,permissions
varchar(255) null,created_at
timestamp null,updated_at
timestamp null,deleted_at
timestamp null) default character set utf8 collate utf8_unicode_ci engin e = InnoDB)[PDOException] SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'navigation' already exists
可以给我一些建议吗?我做错了什么?我已经看到 this package 但我不确定它是否能解决我的问题。
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'navigation' already exists
表示你在数据库中有相同的table名字
所以你需要验证一下,你的数据库中没有任何table与name。
- 确保没有 table 同名的名字
运行再次迁移
php artisan migration:rollback
有时由于不同的原因无法删除 table。