我正在与Postgres数据库一起使用Laravel 5.6和Heroku。
我已将我的应用程序上传到Heroku,登录表单正确显示给我。
当使用:heroku run php artisan migrate
和使用Postgres of Heroku进行表的迁移时出现问题,我正确地进行了所有配置,但是在进行迁移时会发生这种情况:
在Connection.php第664行中:
SQLSTATE [42830]:无效的外键:7错误:没有唯一约束匹配给定的引用“用户”的键(SQL:alter table“sales”add constraint“sales_user_id_foreign”foreign key(“user_id”)引用“us” ers“(”id“))
在Connection.php第458行:
SQLSTATE [42830]:无效的外键:7错误:没有唯一约束匹配给定的引用“用户”的键
奇怪的是,本地相同的迁移并没有给我带来任何问题(MySQL),但Heroku与Postgres显示错误。
这些是我的用户和销售迁移:
用户:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->integer('id')->unsigned();
$table->foreign('id')->references('id')->on('people')->onDelete('cascade');
$table->string('user')->unique();
$table->string('password');
$table->boolean('state')->default(1);
$table->integer('idRole')->unsigned();
$table->foreign('idRole')->references('id')->on('roles');
$table->rememberToken();
//$table->timestamps();
});
}
销售:
public function up()
{
Schema::create('sales', function (Blueprint $table) {
$table->increments('id');
$table->integer('client_id')->unsigned();
$table->foreign('client_id')->references('id')->on('people');
$table->unsignedInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->dateTime('date_time');
$table->decimal('total', 11, 2);
$table->string('status', 20);
$table->timestamps();
});
}
我不知道为什么我在Heroku中有这个错误,但一切都在本地工作。我怎样才能解决这个问题?
这是因为表id
上的users
列没有唯一约束。您可以将id
列设置为自动增量并再次运行迁移:
用户
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
// Other codes
});
}
奇怪的是,本地相同的迁移并没有给我带来任何问题(MySQL),但Heroku与Postgres显示错误。
在开发和生产中使用相同的数据库软件总是一个好主意。即使使用ORM和架构迁移工具,MySQL和PostgreSQL也不是彼此的替代品。肯定会有一个人会幸福而另一个人却不会幸福。
我怀疑如果你在Heroku上使用MySQL,你的问题就会消失。 Heroku不提供MySQL本身,但你可以使用a couple of addons。 JawsDB和ClearDB都是流行的选择,或者如果你愿意,你可以在像RDS这样的东西上托管你自己的MySQL数据库。
您也可以在本地切换到Postgres,看看是否可以重现错误。