Ошибка миграции

273
04 апреля 2017, 13:05
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, чтобы присваивать пользователю картинку (аватар).

Answer 1

Распишу чуть подробнее: Проблема в том, что вы создаете ссылку на таблицу которой нету, да вы можете поменять время создания (название файла) тех таблиц, что б они стояли выше, но думаю это не очень эстетично, у вас будут появляться все новые связки и вам все время делать 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');
        });
    }
}

Это облегчит в последствии несколько проблем, вы всегда сможете вспомнить как развивались события, ну и в случае чего легко откатиться назад.

READ ALSO
Ругается на конструкцию if

Ругается на конструкцию if

Почему выдаёт ошибку Parse error: syntax error, unexpected 'if' (T_IF)?

256
Сократить код C++

Сократить код C++

Добрый вечер! Есть такой код

204