errno: 150 «Ограничение внешнего ключа сформировано неправильно») - PullRequest
1 голос
/ 26 марта 2020

Может кто-нибудь дать мне решение из следующего сообщения об ошибке "errno: 150" Ограничение внешнего ключа неправильно сформировано ")"?. Проблема возникает, когда я хочу создать внешний ключ из таблицы пользователя в таблицу профиля с помощью атрибута электронной почты, где первичным ключом в таблице профиля является само электронное письмо.

Пользователи таблицы

Schema::create('users', function (Blueprint $table) {
        $table->bigInteger('id', 20)->autoIncrement();
        $table->string('id_provider', 20)->nullable();
        $table->string('provider_name', 255);
        $table->string('email', 255)->unique();
        $table->foreign('email', 255)->references('email')->on('profile')->onDelete('cascade');
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password', 255)->nullable();
        $table->string('role', 12);
        $table->rememberToken();
        $table->timestamps();
        $table->primary('id');
    });

Модель пользователя

/**
 * Get the profile record associated with user.
 */
public function profile()
{
    return $this->hasOne('App\Profile');
}

Профиль Tabel

Schema::create('profile', function (Blueprint $table) {
        $table->string('email', 255)->unique();
        $table->string('name', 255);
        $table->integer('phone_number', 12)->nullable();
        $table->string('gender', 6)->nullable();
        $table->integer('date', 2)->nullable();
        $table->string('month', 9)->nullable();
        $table->integer('year', 4)->nullable();
        $table->bigInteger('id_address', 20)->nullable();
        $table->string('avatar', 100);
        $table->primary('email');
    });

Профиль модели

 /**
 * Get the user that owns the profile.
 */
public function user()
{
    return $this->belongsTo('App\User');
}

Спасибо за все решения.

Ответы [ 2 ]

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

Столбец внешнего ключа имеет тип STRING unique (), а указанный столбец имеет тип PRIMARY вместо типа STRING. В вашей таблице профиля есть два столбца с одинаковыми именами, но разного типа.

Профиль таблицы

Schema::create('profile', function (Blueprint $table) {
    $table->string('email', 255)->unique();
    $table->string('name', 255);
    $table->integer('phone_number', 12)->nullable();
    $table->string('gender', 6)->nullable();
    $table->integer('date', 2)->nullable();
    $table->string('month', 9)->nullable();
    $table->integer('year', 4)->nullable();
    $table->bigInteger('id_address', 20)->nullable();
    $table->string('avatar', 100);
    $table->primary('email'); <--------You have a mix up here. The column should be $table->primary('id')
});
1 голос
/ 26 марта 2020

$table->foreign('email')->references('email')->on('profile');

Модель вашего пользователя:

public function profile()
{
  return $this->hasOne(Profile::class, 'email', 'email');
}

Модель вашего профиля:

public function user()
{
    return $this->belongsTo(User::class);
}
...