SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint `users_image_id_foreign` foreign key (`image_id`) references `file` (`id`))
Таблица users
public function up()
{
Schema::create('users', function (Blueprint $table) {
...
$table->integer('image_id');
...
});
Schema::table('users', function($table) {
$table->foreign('image_id')
->references('id')->on('file');
});
}
Таблица file
public function up()
{
Schema::create('file', function (Blueprint $table) {
$table->increments('id');
...
});
}
Я неправильно прописал fk?
Изначально хотел связать таблицу users и files, чтобы присваивать пользователю картинку (аватар).
Распишу чуть подробнее:
Проблема в том, что вы создаете ссылку на таблицу которой нету, да вы можете поменять время создания (название файла) тех таблиц, что б они стояли выше, но думаю это не очень эстетично, у вас будут появляться все новые связки и вам все время делать migrate:refresh ?
Плюс в итоге можно запутаться что, когда, зачем делалось, поэтому логично делать так:
1) Создаете миграцию с таблицей на которое должно ссылаться поле, в вашем примере создаете таблице files: class CreateFilesTable() extends Migration{...}
2) Затем создаете еще одну миграцию с "говорящим" названием, например add_filed_file_to_users_table и в ней создаете ваше поле file_id и затем описываете ссылку
class AddFiledFileIdToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->integer('file_id')->unsigned()->nullable();
$table->foreign('file_id')
->references('id')->on('files')
->onDelete('set null');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropForeign('users_file_id_foreign');
});
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('file_id');
});
}
}
Это облегчит в последствии несколько проблем, вы всегда сможете вспомнить как развивались события, ну и в случае чего легко откатиться назад.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости