Ограничение внешнего ключа неправильно сформировано в laravel 7 - PullRequest
3 голосов
/ 22 марта 2020

Я создаю приложение управления гостиницей, используя laravel. Я пытаюсь создать таблицы 'reservations' в laravel, но когда я запускаю команду 'migrate: fre sh', я получаю следующее: ошибка "Ограничение внешнего ключа сформировано неправильно". Может кто-нибудь сказать, что вы подразумеваете под этой ошибкой?

Ошибка просмотра

public function up()
        {
            Schema::create('room_types', function (Blueprint $table) {
                $table->id();
                $table->string('title')->unique();
                $table->string('slug')->unique();
                $table->string('short_code')->unique();
                $table->longText('description')->nullable();
                $table->integer('base_capacity')->default(0);
                $table->integer('higher_capacity')->default(0);
                $table->boolean('extra_bed')->default(0);
                $table->integer('kids_capacity')->default(0);
                $table->float('base_price',8,2)->default(0);
                $table->float('additional_person_price',8,2)->default(0);
                $table->float('extra_bed_price',8,2)->default(0);
                $table->boolean('status')->default(1);
                $table->softDeletes();
                $table->timestamps();
            });
        }

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');

            $table->string('usertype')->default('user');
            $table->string('last_name')->nullable();
            $table->string('phone')->nullable();
            $table->date('dob')->nullable();
            $table->longText('address')->nullable();
            $table->enum('sex',['M','F','O'])->default('M');
            $table->string('picture')->nullable();
            $table->string('id_type')->nullable();
            $table->string('id_number')->nullable();
            $table->string('id_card_image_front')->nullable();
            $table->string('id_card_image_back')->nullable();
            $table->string('company_name')->nullable();
            $table->string('gst_no')->nullable();
            $table->text('remarks')->nullable();
            $table->boolean('vip')->default(0);
            $table->boolean('status')->default(1);

            $table->rememberToken();
            $table->timestamps();
        });
    }




public function up()
    {
        Schema::create('reservations', function (Blueprint $table) {
            $table->id();
            $table->integer('uid')->unique();
            $table->timestamp('date');
            $table->unsignedInteger('user_id');
            $table->unsignedInteger('room_type_id');
            $table->integer('adults')->default(1);
            $table->integer('kids')->default(0);
            $table->date('check_in');
            $table->date('check_out');
            $table->integer('number_of_room')->default(1);
            $table->enum('status',['PENDING','CANCEL','SUCCESS'])->default('PENDING');
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('room_type_id')->references('id')->on('room_types')->onDelete('cascade');
        });
    }

Сообщение об ошибке

  SQLSTATE[HY000]: General error: 1005 Can't create table `hotelplex`.`reservations` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `reservations` add constraint `reservations_reservations_user_id_foreign` foreign key (`reservations_user_id`) references `users` (`id`) on delete cascade)

          at C:\xampp\htdocs\hotelplex\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669
            665|         // If an exception occurs when attempting to run a query, we'll format the error
            666|         // message to include the bindings with SQL, which will make this exception a
            667|         // lot more helpful to the developer instead of just the database's errors.
            668|         catch (Exception $e) {
          > 669|             throw new QueryException(
            670|                 $query, $this->prepareBindings($bindings), $e
            671|             );
            672|         }
            673| 

          1   C:\xampp\htdocs\hotelplex\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463
              PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `hotelplex`.`reservations` (errno: 150 "Foreign key constraint is incorrectly formed")")

          2   C:\xampp\htdocs\hotelplex\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463
              PDOStatement::execute()

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Laravel6

Laravel6 не имеет метода id() для создания id в таблице. Laravel7 делает .. Я пытался создать id с использованием $table->id() с использованием Laravel6 и получил следующую ошибку.

Кажется, вы отправили неверную ошибку или вы уже создали id вручную в своих таблицах .

Вы можете использовать bigIncrements, bigInteger, increments, integer et c.

Здесь вы можете найти все доступные методы

Laravel7

Согласно Laravel7 $table->id() псевдоним псевдонима $table->bigIncrements('id'), т. Е. unsigned big integer.

Для создания Foreign key тип данных для child column должен точно соответствовать parent column.

Поскольку users.id и room_types.id является bigIncrements, тогда reservations.user_id и reservations.room_type_id также должны быть unsignedbigInteger, а не unsignedInteger.

заставить его работать

изменить

$table->unsignedInteger('user_id'); 
$table->unsignedInteger('room_type_id');

на

$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('room_type_id');

Как это:

public function up()
    {
        Schema::create('reservations', function (Blueprint $table) {
            $table->id();
            $table->integer('uid')->unique();
            $table->timestamp('date');
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('room_type_id');
            $table->integer('adults')->default(1);
            $table->integer('kids')->default(0);
            $table->date('check_in');
            $table->date('check_out');
            $table->integer('number_of_room')->default(1);
            $table->enum('status',['PENDING','CANCEL','SUCCESS'])->default('PENDING');
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('room_type_id')->references('id')->on('room_types')->onDelete('cascade');
        });
    }

https://laravel.com/docs/7.x/migrations#creating -колонки

enter image description here

0 голосов
/ 22 марта 2020

Кажется, проблема в несовпадении типов данных для user_id и room_type_id

$ table-> id (); псевдоним псевдонима $ table-> bigIncrements ('id');

https://laravel.com/docs/master/migrations#columns

Итак, вам нужен внешний столбец user_id и room_type_id на бронирование как:

public function up()
{
    Schema::create('reservations', function (Blueprint $table) {
        // Structure
        $table->id();
        ...
        $table->unsignedBigInteger('user_id');
        $table->unsignedBigInteger('room_type_id');
        ...
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
         $table->foreign('room_type_id')->references('id')->on('room_types')->onDelete('cascade');
            ...
         })
    }
0 голосов
/ 22 марта 2020

->onDelete('cascade'); должно быть в части создания структуры.

Измените на:

public function up()
{
    Schema::create('reservations', function (Blueprint $table) {
        // Structure
        $table->id();
        $table->integer('uid')->unique();
        $table->timestamp('date');
        $table-> unsignedBigInteger('user_id')->onDelete('cascade');
        $table-> unsignedBigInteger('room_type_id')->onDelete('cascade');
        $table->integer('adults')->default(1);
        $table->integer('kids')->default(0);
        $table->date('check_in');
        $table->date('check_out');
        $table->integer('number_of_room')->default(1);
        $table->enum('status',['PENDING','CANCEL','SUCCESS'])->default('PENDING');
        $table->timestamps();

        // Relationships
        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('room_type_id')->references('id')->on('room_types');
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...